c# 9.0新特性nint和Pattern matching的使用方法
一:背景
1. 講故事
上一篇跟大家聊到了Target-typed new
和 Lambda 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)文章
C#采用Winform實(shí)現(xiàn)類似Android的Listener
這篇文章主要介紹了C#采用Winform實(shí)現(xiàn)類似Android的Listener,很實(shí)用的技巧,需要的朋友可以參考下2014-08-08c#中Empty()和DefalutIfEmpty()用法分析
這篇文章主要介紹了c#中Empty()和DefalutIfEmpty()用法,以實(shí)例形式分析了針對不同情況下Empty()和DefalutIfEmpty()用法區(qū)別,需要的朋友可以參考下2014-11-11C#調(diào)用HTTP POST請求上傳圖片的示例代碼
現(xiàn)在很多B/S系統(tǒng)的開發(fā)都是通過API方式來進(jìn)行的,一般服務(wù)端會開放一個(gè)API接口,客戶端調(diào)用API接口來實(shí)現(xiàn)圖片或文件上傳的功能,感興趣的可以了解一下2021-05-05基于C#實(shí)現(xiàn)進(jìn)程回收管理工具
這篇文章主要為大家詳細(xì)介紹了入戶基于C#實(shí)現(xiàn)一個(gè)進(jìn)程回收管理工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04C# Dictionary和SortedDictionary的簡介
今天小編就為大家分享一篇關(guān)于C# Dictionary和SortedDictionary的簡介,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10Jquery+Ajax+Json+存儲過程實(shí)現(xiàn)高效分頁
這篇文章主要介紹Jquery+Ajax+Json+存儲過程實(shí)現(xiàn)分頁,需要的朋友可以參考下2015-08-08C#中動態(tài)顯示當(dāng)前系統(tǒng)時(shí)間的實(shí)例方法
想在網(wǎng)頁中動態(tài)地顯示當(dāng)前系統(tǒng)的時(shí)間,找了好多,不過都是一些停在那里不動的。。。不過皇天不負(fù)有心人,終于讓我找到了2013-05-05DevExpress之ChartControl實(shí)現(xiàn)餅狀圖百分比演示實(shí)例
這篇文章主要介紹了DevExpress之ChartControl實(shí)現(xiàn)餅狀圖百分比演示的方法,實(shí)例講述了窗體與圖形繪制函數(shù)的用法,需要的朋友可以參考下2014-10-10