欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c# 9.0新特性nint和Pattern matching的使用方法

 更新時(shí)間:2020年06月15日 16:23:54   作者:一線碼農(nóng)  
這篇文章主要介紹了c# 9.0新特性nint和Pattern matching的使用方法,文中講解非常細(xì)致,幫助你更好的學(xué)習(xí)c# 9.0,有需求的朋友可以參考下

一:背景

1. 講故事

上一篇跟大家聊到了Target-typed newLambda discard parameters,看博客園和公號里的閱讀量都達(dá)到了新高,甚是欣慰,不管大家對新特性是多頭還是空頭,起碼還是對它抱有一種極為關(guān)注的態(tài)度,所以我的這個(gè)系列還得跟,那就繼續(xù)開擼吧,今天繼續(xù)帶來兩個(gè)新特性,更多新特性列表,請大家關(guān)注:新特性預(yù)覽

二:新特性研究

1. Native ints

從字面上看貌似是什么原生類型ints,有點(diǎn)莫名其妙,還是看一看Issues上舉得例子吧:

Summary: nint i = 1; and nuint i2 = 2;

Shipped in preview in 16.7p1.

有點(diǎn)意思,還是第一次看到有nint這么個(gè)東西,應(yīng)該就是C#9新增的關(guān)鍵詞,好奇心爆棚,快來實(shí)操一下。

 static void Main(string[] args)
 {
  nint i = 10;
  Console.WriteLine($"i={i}");
 }

從圖中看,可以原樣輸出,然后用ILSpy查查底層IL代碼,發(fā)現(xiàn)連IL代碼都不用看😁😁😁。如下圖:

從圖中看原來 nint 就是 IntPtr 結(jié)構(gòu)體哈,如果你玩過 C# 到 C++ 之間的互操作,我相信你會對Ptr再熟悉不過了,從這個(gè) nint 上看,你不覺得C#團(tuán)隊(duì)對指針操作是前所未有的重視嗎? 前有指針類型IntPtr,后有內(nèi)存段處理集合Span,到現(xiàn)在直接提供關(guān)鍵詞支持,就是盡最大努力讓你在類型安全的前提下使用指針。

這就讓我想起了前些天寫的一篇互操作的文章,現(xiàn)在就可以用nint進(jìn)行簡化了,來段代碼給大家看一下。

  • 原來的寫法:
     [DllImport("ConsoleApplication1.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
      extern static IntPtr AddPerson(Person person);
    
      static void Main(string[] args)
      {
       var person = new Person() { username = "dotnetfly", password = "123456" };
       var ptr = AddPerson(person);
       var str = Marshal.PtrToStringAnsi(ptr);
      }
  • IntPtr -> nint 的寫法

總的來說這個(gè)關(guān)鍵詞不是最重要的,重要的是C#團(tuán)隊(duì)對指針操作抱有前所未有的重視,這是一個(gè)非常積極的信號。

2. Pattern matching improvements

模式匹配這個(gè)不算是什么新特性了,在本次C#9中也是繼續(xù)得到了完善,可能有很多朋友對模式匹配不是很熟悉,畢竟是C#7才有的新玩法,后面幾乎每一個(gè)新版本都在跟蹤完善,我先科普一下吧。

❤ 模式匹配到底解決了什么問題

大家在編碼的過程中,不可能遇不到 if/else 嵌套 if/else 的這種情況,有時(shí)候嵌套甚至達(dá)到5,6層之多,特別影響代碼可讀性,我就來YY個(gè)例子。

現(xiàn)在各個(gè)地方都在發(fā)不同面值的消費(fèi)券,為了實(shí)現(xiàn)千人千面,消費(fèi)券的發(fā)放規(guī)則如下:

性別 年齡 地區(qū) 面值
<20 安徽 2000
<40 上海 4000
剩余 剩余 3000
<20 安徽 2500
<60 安徽 1500

如果用傳統(tǒng)的方式,你肯定要用各種花哨的if/else來實(shí)現(xiàn),如下代碼:

  static decimal GetTicket(string sex, int age, string area)
  {
   if (sex == "男")
   {
    if (age < 20 && area == "安徽")
    {
     return 2000;
    }
    else
    {
     if (age < 40 && area == "上海")
     {
      return 4000;
     }
     else
     {
      return 3000;
     }
    }
   }
   else
   {
    if (age < 20 && area == "安徽")
    {
     return 2500;
    }
    if (age < 60 && area == "安徽")
    {
     return 1500;
    }
   }

   return 0;
  }

這種代碼可讀性不是一般的差,就像大強(qiáng)子說的那樣:看著都想打人。。。 問題來了,這代碼還有救嗎??? 當(dāng)然有了,這就需要用Pattern matching 去簡化,畢竟它就是為了這種問題而生的,修改后的代碼如下:

  static decimal GetTicket_Pattern(string sex, int age, string area)
  {
   return (sex, age, area) switch
   {
    ("男", < 20, "安徽") => 2000,
    ("男", < 40, "上海") => 4000,
    ("男", _, _) => 3000,
    ("女", < 20, "安徽") => 2500,
    ("女", < 60, "安徽") => 1500,
    _ => 0
   };
  }

看到這種化簡后的代碼是不是非常驚訝,這就是 Pattern matching 要幫你解決的場景,接下來看看底層的IL代碼是什么樣子。

從圖中看,這反編譯后的代碼比我手工寫的還要爛,無力吐槽哈,當(dāng)然 模式匹配 有各種千奇百怪的玩法,絕對讓你瞠目結(jié)舌,更多玩法可參考官方文檔:模式匹配

這個(gè)特性最重要的是你一定要明白它的客戶群在哪里?

三: 總結(jié)

總的來說,這兩個(gè)特性都是比較實(shí)用的,尤其是 Pattern matching 化解了你多少不得不這么寫的爛代碼,頭發(fā)護(hù)理就靠它了,快來給它點(diǎn)個(gè)贊吧!

好了,先就這樣吧,感謝您的閱讀,希望本篇對你有幫助,謝謝。

以上就是c# 9.0新特性nint和Pattern matching的使用方法的詳細(xì)內(nèi)容,更多關(guān)于c# nint和Pattern matching的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論