1. 程式人生 > >快醒醒,C# 9 中又來了一堆關鍵詞 init,record,with

快醒醒,C# 9 中又來了一堆關鍵詞 init,record,with

## 一:背景 ### 1. 講故事 .NET5 終於在 2020-08-25 也就是大前天釋出了第八個預覽版,這麼多的預覽版搞得我都麻木了,接踵而來的就是更多的新特性加入到了 C# 9 中,既然還想呆在這條船上,得繼續硬著頭皮學習哈,這一篇跟大家聊聊新增的幾個關鍵詞。 ## 二:新增關鍵詞 ### 1. init 出來一個新語法糖,首先要做的就是去揭它的老底,這樣可以方便推測它的應用場景,為了方便表述,我先上一個例子: ``` C# public class Person { public string Name { get; init; } } ``` 乍一看有點懵逼,沒關係,先用 ILSpy 看一下,如下圖: ![](https://img2020.cnblogs.com/other/214741/202008/214741-20200828071500305-102270307.png) 上面這張圖就已經很清晰的解釋了,原來 `init` 就是自動生成了一個對 私有隻讀欄位 的封裝,對於 readonly 相信大家已經輕車熟路了,它的初始化只有兩種方式:宣告時和建構函式中,但從 C# 9 開始就多了一個屬性賦值方式,也就是說現在有三種賦值方式了,還原始碼如下: ``` C# public class Person { private readonly string name; public string Name { get => name; init { name = value; } } } ``` 這種方式要是換作以前肯定是報錯的,如下圖: ![](https://img2020.cnblogs.com/other/214741/202008/214741-20200828071500579-427523929.png) 有一點要注意的是編譯器還做了一個特殊限制,準你在 `類初始化器` 中使用,不准你單獨拿出來賦值,如下圖所示: ![](https://img2020.cnblogs.com/other/214741/202008/214741-20200828071500885-162995774.png) 所以總的來說, `init` 的作用就是多了一種讓你初始化 只讀欄位 的方式,僅此而已罷了。 ### 2. record 為了方便演示,我先上一段程式碼,如下所示: ``` C# public record Person { public string Name { get; set; } public int Age { get; set; } } ``` 看起來挺