C# 9.0 添加和增強的功能【基礎篇】

一、記錄(record)C# 9.0 引入了記錄類型 ??墒褂?nbsp;record 關鍵字定義一個引用類型,以最簡的方式創建不可變類型 。這種類型是線程安全的,不需要進行線程同步,非常適合并行計算的數據共享 。它減少了更新對象會引起各種bug的風險,更為安全 。System.DateTime 和 string 也是不可變類型非常經典的代表 。
與類不同的是 , 它是基于值相等而不是唯一的標識符--對象的引用 。
通過使用位置參數或標準屬性語法,可以創建具有不可變屬性的記錄類型,整個對象都是不可變的,且行為像一個值 。
優點:
??1)在構造不可變的數據結構時,它的語法簡單易用;
??2)record 為引用類型,不用像值類型在傳遞時需要內存分配 , 還可整體拷貝;
??3)構造函數和結構函數為一體的、簡化的位置記錄;
??4)有力的相等性支持 —— 重寫了 Equals(object), IEquatable, 和 GetHashCode() 這些基本方法 。
record 類型可以定義為可變的,也可以是不可變的 。
// 沒有 set 訪問器,創建后不可更改,叫不可變類型public record Person{// 要支持用對象初始化器進行初始化,則在屬性中使用 init 關鍵字// 或者以構造函數的方式public string? FirstName { get; init; }public string? LastName { get; init; }}// 可變類型的 record// 因為有 set 訪問器,所以它支持用對象初始化器進行初始化public record Person{public string? FirstName { get; set; }public string? LastName { get; set; }}記錄(record)和類一樣,在面向對象方面,支持繼承 , 多態等所有特性 。除過前面提到的 record 專有的特性,其他語法寫法跟類也是一樣 。同其他類型一樣,record 的基類依然是 object 。
??注意:1)記錄只能從記錄繼承 , 不能從類繼承,也不能被任何類繼承; 2)record 不能定義為 static 的 , 但是可以有 static 成員 。
從本質上來講,record 仍然是一個類,但是關鍵字 record 賦予這個類額外的幾個像值的行為:
??1)基于值相等性的比較方法,如 Equals,==,!=,EqualityContract 等; 2)重寫 GetHashCode(); 3)拷貝和克隆成員; 4)PrintMembers 和 ToString() 方法 。
應用場景:
??1)用于 web api 返回的數據,通常作為一種一次性的傳輸型數據,不需要是可變的,因此適合使用 record;2)作為不可變數據類型 record 對于并行計算和多線程之間的數據共享非常適合,安全可靠;3)record 本身的不可變性和 ToString 的數據內容的輸出 , 不需要人工編寫很多代碼,就適合進行日志處理;4)其他涉及到有大量基于值類型比較和復制的場景,也是 record 的常用的使用場景 。
with 表達式??當使用不可變的數據時,一個常見的模式是從現存的值創建新值來呈現一個新狀態 。
??例如,如果 Person 打算改變他的姓氏(last name),我們就需要通過拷貝原來數據,并賦予一個不同的 last name 值來呈現一個新 Person 。這種技術被稱為非破壞性改變 。作為描繪隨時間變化的 person,record 呈現了一個特定時間的 person 的狀態 。為了幫助進行這種類型的編程,針對 records 就提出了 with 表達式,用于拷貝原有對象,并對特定屬性進行修改
// 修改特定屬性后復制給新的 recordvar person = new Person { FirstName = "Mads", LastName = "Nielsen" };var otherPerson = person with { LastName = "Torgersen" };// 只是進行拷貝,不需要修改屬性 , 那么無須指定任何屬性修改Person clone = person with { };??with 表達式使用初始化語法來說明新對象在哪里與原有對象不同 。with 表達式實際上是拷貝原來對象的整個狀態值到新對象,然后根據對象初始化器來改變指定值 。這意味著屬性必須有 init 或者 set 訪問器 , 才能用 with 表達式進行更改 。
??注意:1)with 表達式左邊操作數必須為 record 類型; 2)record 的引用類型成員,在拷貝的時候,只是將所指實例的引用進行了拷貝 。

    推薦閱讀