快醒醒,C# 9 中又來了一堆關鍵詞 init,record,with
阿新 • • 發佈:2020-08-28
## 一:背景
### 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; }
}
```
看起來挺