<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          C# 9 新特性:增強(qiáng)的模式匹配了解一下!

          共 2248字,需瀏覽 5分鐘

           ·

          2021-01-06 12:56

          C# 9 新特性 —— 增強(qiáng)的模式匹配

          Intro

          C# 9 中進(jìn)一步增強(qiáng)了模式匹配的用法,使得模式匹配更為強(qiáng)大,我們一起來了解一下吧

          Sample

          C# 9 中增強(qiáng)了模式匹配的用法,增加了 and/or/not 操作符,而且可以直接判斷屬性,來看一下下面的這個(gè)示例:

          var?person?=?new?Person();

          //?or
          //?string.IsNullOrEmpty(person.Description)
          if?(person.Description?is?null?or?{?Length:?0?})
          {
          ????Console.WriteLine($"{nameof(person.Description)}?is?IsNullOrEmpty");
          }

          //?and
          //?!string.IsNullOrEmpty(person.Name)
          if?(person.Name?is?not?null?and?{?Length:?>?0?})
          {
          ????if?(person.Name[0]?is?(>=?'a'?and?<=?'z')?or?(>=?'A'?and?<=?'Z')?or?'.')
          ????{
          ????}
          }

          //?not
          if?(person.Name?is?not?null)
          {
          }

          這里的代碼使用 DnSpy 反編譯之后的代碼是下面這樣的:

          Person?person?=?new?Person();
          string?text?=?person.Description;
          bool?flag?=?text?==?null?||?text.Length?==?0;
          if?(flag)
          {
          ????Console.WriteLine("Description?is?IsNullOrEmpty");
          }
          text?=?person.Name;
          bool?flag2?=?text?!=?null?&&?text.Length?>?0;
          if?(flag2)
          {
          ????char?c?=?person.Name[0];
          ????if?(c?>=?'a')
          ????{
          ????????if?(c?>?'z')
          ????????{
          ????????????goto?IL_8B;
          ????????}
          ????}
          ????else?if?(c?>=?'A')
          ????{
          ????????if?(c?>?'Z')
          ????????{
          ????????????goto?IL_8B;
          ????????}
          ????}
          ????else?if?(c?!=?','?&&?c?!=?'.')
          ????{
          ????????goto?IL_8B;
          ????}
          ????bool?flag3?=?true;
          ????goto?IL_8E;
          ????IL_8B:
          ????flag3?=?false;
          ????IL_8E:
          ????bool?flag4?=?flag3;
          ????if?(flag4)
          ????{
          ????}
          }
          bool?flag5?=?person.Name?!=?null;
          if?(flag5)
          {
          }

          Switch

          這不僅適用于 is 也可以在 switch 中使用

          switch?(person.Age)
          {
          ????case?>=?0?and?<=?3:
          ????????Console.WriteLine("baby");
          ????????break;

          ????case?>?3?and?14:
          ????????Console.WriteLine("child");
          ????????break;

          ????case?>?14?and?22:
          ????????Console.WriteLine("youth");
          ????????break;

          ????case?>?22?and?60:
          ????????Console.WriteLine("Adult");
          ????????break;

          ????case?>=?60?and?<=?500:
          ????????Console.WriteLine("Old?man");
          ????????break;

          ????case?>?500:
          ????????Console.WriteLine("monster");
          ????????break;
          }

          反編譯后的代碼:

          int?age?=?person.Age;
          int?num?=?age;
          if?(num?22)
          {
          ????if?(num?14)
          ????{
          ????????if?(num?>=?0)
          ????????{
          ????????????if?(num?>?3)
          ????????????{
          ????????????????Console.WriteLine("child");
          ????????????}
          ????????????else
          ????????????{
          ????????????????Console.WriteLine("baby");
          ????????????}
          ????????}
          ????}
          ????else?if?(num?>?14)
          ????{
          ????????Console.WriteLine("youth");
          ????}
          }
          else?if?(num?60)
          {
          ????if?(num?>?22)
          ????{
          ????????Console.WriteLine("Adult");
          ????}
          }
          else?if?(num?>?500)
          {
          ????Console.WriteLine("monster");
          }
          else
          {
          ????Console.WriteLine("Old?man");
          }

          More

          可以看到有些情況下可以簡(jiǎn)化不少代碼,尤其是 if 分支比較多的情況下使用上面 switch 這樣的寫法會(huì)清晰很多

          但是如果只是 string.IsNullOrEmpty 這種代碼最好還是不要寫得這么騷了,小心要被同事吐槽了

          炫技需謹(jǐn)慎,小心被 ...

          Reference

          • https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9
          • https://github.com/WeihanLi/SamplesInPractice/tree/master/CSharp9Sample
          • https://github.com/WeihanLi/SamplesInPractice/blob/master/CSharp9Sample/PatternMatchingSample.cs
          回復(fù)?【關(guān)閉】學(xué)關(guān)
          回復(fù)?【實(shí)戰(zhàn)】獲取20套實(shí)戰(zhàn)源碼
          回復(fù)?【被刪】學(xué)個(gè)
          回復(fù)?【訪客】學(xué)
          回復(fù)?【小程序】學(xué)獲取15套【入門+實(shí)戰(zhàn)+賺錢】小程序源碼
          回復(fù)?【python】學(xué)微獲取全套0基礎(chǔ)Python知識(shí)手冊(cè)
          回復(fù)?【2019】獲取2019 .NET 開發(fā)者峰會(huì)資料PPT
          回復(fù)?【加群】加入dotnet微信交流群

          再見,VIP,臥槽又來一個(gè)看片神器!


          副業(yè)剛需,個(gè)人開發(fā)者如何通過小程序變現(xiàn)?已經(jīng)有朋友變現(xiàn)月入4k了!


          瀏覽 53
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  青青草天天爽 | 日韩在线69| 国产成人在线观看免费网站 | 一本色道久久综合亚州AV | 亚洲男人天堂网 |