C#9.0 終於來了,帶你一塊兒解讀 nint 和 Pattern matching 兩大新特性玩法

一:背景

1. 講故事安全

上一篇跟你們聊到了Target-typed new 和 Lambda discard parameters,看博客園和公號裏的閱讀量都達到了新高,甚是欣慰,無論你們對新特性是多頭仍是空頭,起碼仍是對它抱有一種極爲關注的態度,因此個人這個系列還得跟,那就繼續開擼吧,今天繼續帶來兩個新特性,更多新特性列表,請你們關注:新特性預覽ide

二:新特性研究

1. Native intsui

從字面上看貌似是什麼原生類型ints,有點莫名其妙,仍是看一看Issues上舉得例子吧:編碼

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

Shipped in preview in 16.7p1.

有點意思,仍是第一次看到有nint這麼個東西,應該就是C#9新增的關鍵詞,好奇心爆棚,快來實操一下。3d

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

C#9.0 終於來了,帶你一塊兒解讀 nint 和 Pattern matching 兩大新特性玩法

從圖中看,能夠原樣輸出,而後用ILSpy查查底層IL代碼,發現連IL代碼都不用看。以下圖:指針

C#9.0 終於來了,帶你一塊兒解讀 nint 和 Pattern matching 兩大新特性玩法

從圖中看原來 nint 就是 IntPtr 結構體哈,若是你玩過 C# 到 C++ 之間的互操做,我相信你會對Ptr再熟悉不過了,從這個 nint 上看,你不以爲C#團隊對指針操做是史無前例的重視嗎? 前有指針類型IntPtr,後有內存段處理集合Span,到如今直接提供關鍵詞支持,就是盡最大努力讓你在類型安全的前提下使用指針。code

這就讓我想起了前些天寫的一篇互操做的文章,如今就能夠用nint進行簡化了,來段代碼給你們看一下。blog

  • 原來的寫法:ip

    [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 的寫法
    C#9.0 終於來了,帶你一塊兒解讀 nint 和 Pattern matching 兩大新特性玩法

總的來講這個關鍵詞不是最重要的,重要的是C#團隊對指針操做抱有史無前例的重視,這是一個很是積極的信號。內存

2. Pattern matching improvements

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

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

你們在編碼的過程當中,不可能遇不到 if/else 嵌套 if/else 的這種狀況,有時候嵌套甚至達到5,6層之多,特別影響代碼可讀性,我就來YY個例子。

如今各個地方都在發不一樣面值的消費券,爲了實現千人千面,消費券的發放規則以下:

性別 年齡 地區 面值
男 <20 安徽 2000
男 <40 上海 4000
男 剩餘 剩餘 3000
女 <20 安徽 2500
女 <60 安徽 1500
若是用傳統的方式,你確定要用各類花哨的if/else來實現,以下代碼:

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;
    }

這種代碼可讀性不是通常的差,就像大強子說的那樣:看着都想打人。。。問題來了,這代碼還有救嗎???固然有了,這就須要用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代碼是什麼樣子。

C#9.0 終於來了,帶你一塊兒解讀 nint 和 Pattern matching 兩大新特性玩法

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

這個特性最重要的是你必定要明白它的客戶羣在哪裏?

三:總結

總的來講,這兩個特性都是比較實用的,尤爲是 Pattern matching 化解了你多少不得不這麼寫的爛代碼,頭髮護理就靠它了,快來給它點個贊吧!

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

相關文章
相關標籤/搜索