C# 11 新功能 -- Required members

Required members 也是個滿有意思,這是一個應用在屬性上的功能。

Property (屬性) 在 C# 歷代演進常常都會插上這麼一腳,從早期自動實作屬性、運算式主體成員、init 指派到現在 C# 11 的 required members。

用過 init 的朋友們應該都曉得 init 雖然是個 setter ,但卻只能在物件初始設定式使用,這玩意有點感覺是為了讓大家少寫這麼一點建構式。好處是不需寫一堆多載建構式;壞處則是若這個屬性無法強迫要求一定得要設定這個屬性。於是乎若要強迫設定這個屬性,還是免不了回到一堆建構式的世界裡。

為了解決這個問題,required members 隆重登場,用法很簡單,就是加上個 required 修飾詞,例如 (可搭配 set ,不一定非用 init 不可):

public class Person
{    
    public required string FirstName { get; init; }
    public required string LastName { get; init; }
}

在建立 Person 類別的執行個體時就必須要帶上 FirstName 和 LastName 兩個屬性的初始化設定式:

var p1 = new Person { FirstName = "ABC", LastName = "DEF"};

微軟另外考慮到若是可能有某些建構式使用的時候不強制非要設定值,所以多出了另外一個 Attribute SetsRequiredMembersAttribute ,使用方式如下:

public class Person
{
    [SetsRequiredMembers]
    public Person(string firstName, string lastName) => (FirstName, LastName) = (firstName, lastName);

    public Person() { }

    public required string FirstName { get; init; }
    public required string LastName { get; init; }
}

就這麼簡單。