目錄
record是.NET 5中的一種新特性,可以看作是一種概念上不可變的類。records可以幫助我們在C#中更容易地處理資料,同時提供了重要的功能,如物件相等性、hashcode和解構。
與類不同,records具有值語意。也就是說,當比較兩個records的範例時,比較的是這些範例的屬性而非參照。這意味著,如果兩個records的屬性值相同,它們就是相等的。
record也可以簡化需要類似於Dto的資料結構容器的定義。
像定義一個類一樣,public class Person,只是將class關鍵字替換成record關鍵字。然後屬性是用括號來定義。
預設的record宣告是class,如果想宣告一個struct
record是不可變的型別,括號中宣告的屬性在構造之後不可變更。可以使用==按屬性的值進行比較。可以直接作為hash的key以及結構。
record可以像普通類一樣擴充套件可變更的屬性和自定義的方法,語法如下
record可以通過解構,將物件解構為元組,方便一次性獲取record中的屬性值,
record的原理是編譯器提供支援,上述Person定義反編譯結果如下
可以看到,編譯器給使用了record關鍵字的定義生成了對應的屬性和建構函式,並且重寫了ToString(),GetHashCode,Equals還有一個解構函數和!=和==運運算元。其實看到這裡就明白了,為什麼record可以提供值比較,解構,hash等。
不可變性是因為record的屬性是使用了init關鍵字而不是set,這樣子如果對record的物件屬性賦值,編譯器會報錯。
值相等性是重定義了!=和==運運算元
hash是因為重寫了GetHashCode,Equals
解構是定義了Deconstruct方法
我們介紹了.NET 5中引入的record型別及其優點。但對於許多資料物件的簡單情況,如值物件和DTO,推薦使用record型別。雖然record可以定義可變更的屬性和新增方法,不過這樣子有點違背了record的初衷。