日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#9.0 终于来了,带你一起解读 nint 和 Pattern matching 两大新特性玩法

發(fā)布時間:2023/12/4 C# 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#9.0 终于来了,带你一起解读 nint 和 Pattern matching 两大新特性玩法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一:背景

1. 講故事

上一篇C#9.0 終于來了,您還學(xué)的動嗎? 帶上VS一起解讀吧!跟大家聊到了Target-typed new?和?Lambda discard parameters,看博客園和公號里的閱讀量都達(dá)到了新高,甚是欣慰,不管大家對新特性是多頭還是空頭,起碼還是對它抱有一種極為關(guān)注的態(tài)度,所以我的這個系列還得跟,那就繼續(xù)開擼吧,今天繼續(xù)帶來兩個新特性,更多新特性列表,請大家關(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這么個東西,應(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再熟悉不過了,從這個 nint 上看,你不覺得C#團(tuán)隊對指針操作是前所未有的重視嗎??前有指針類型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 的寫法

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

2. Pattern matching improvements

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

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

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

現(xiàn)在各個地方都在發(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 GetTicketFee(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 GetTicketFee_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é)舌,更多玩法可參考官方文檔:模式匹配

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

三:總結(jié)

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

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

總結(jié)

以上是生活随笔為你收集整理的C#9.0 终于来了,带你一起解读 nint 和 Pattern matching 两大新特性玩法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。