C#9.0 终于来了,带你一起解读 nint 和 Pattern matching 两大新特性玩法
一:背景
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)行簡化了,來段代碼給大家看一下。
原來的寫法:
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ī)則如下:
| 男 | <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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET 5 开发WPF - 美食应用登
- 下一篇: c# char unsigned_dll