共用方式為


必要修飾詞 (C# 參考)

required 修飾詞指出,所套用的 字段屬性,必須由 物件初始化表達式進行初始化。 任何初始化類型新實例的表達式都必須初始化所有必要成員。 從 C# 11 開始,可以使用 required 修飾詞。 required 修飾詞可讓開發人員建立必須正確初始化屬性或欄位的類型,但仍允許使用物件初始化表達式進行初始化。 數個規則可確保此行為:

  • required 修飾詞可以套用至 欄位,屬性struct中宣告,以及 class 類型,包括 recordrecord struct 類型。 required 修飾詞無法套用至 interface的成員。
  • 明確介面實作無法標示為 required。 無法在物件初始化表示式中設定它們。
  • 必要成員必須初始化,但可能會初始化為 null。 如果類型是不可為 Null 的參考型別,如果您將成員初始化為 null,編譯程式會發出警告。 如果成員完全未初始化,編譯程式就會發出錯誤。
  • 必須的成員必須至少與其包含的類型一樣可見。 例如,一個 public 類別無法包含 protectedrequired 欄位。 此外,必要屬性必須有設置器(setinit 存取子),其能見度至少應與包含類型相當。 無法存取的成員無法由建立實例的程式代碼設定。
  • 衍生類別無法隱藏基類中宣告的 required 成員。 隱藏必要成員會防止呼叫端使用物件初始設定器。 此外,覆寫必要屬性的衍生型別必須包含 required 修飾詞。 衍生類型無法移除 required 狀態。 在覆寫屬性時,衍生型別可以新增 required 修飾符。
  • 當類型參數包含 new() 條件約束時,任何 required 成員的類型都不能當做類型自變數使用。 編譯程式無法強制在泛型程式代碼中初始化所有必要的成員。
  • 在記錄中,位置參數的宣告上不允許使用 required 修飾詞。 您可以為包含 required 修飾詞的位置屬性新增明確的宣告。

某些類型,例如 位置紀錄,使用主要建構函式來初始化位置屬性。 如果其中任一屬性包含 required 修飾詞,主要建構函式會新增 SetsRequiredMembers 屬性。 這表示主要建構函式會初始化所有必要的成員。 您可以使用 System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute 屬性撰寫自己的建構函式。 不過,編譯程式不會確認這些建構函式會初始化所有必要的成員。 相反地,屬性宣告給編譯程式,建構函式會初始化所有必要的成員。 SetsRequiredMembers 屬性會將這些規則新增至建構函式:

  • 一個用 this()base()屬性註釋的建構函式,如果鏈結到另一個用 SetsRequiredMembers 屬性註釋的建構函式,則也必須包含 SetsRequiredMembers 屬性。 這可確保呼叫端能夠正確使用所有適當的建構函式。
  • 如果 record 型別的成員中有任何屬於 required,則產生的複製建構函式會套用 SetsRequiredMembers 屬性。

警告

SetsRequiredMembers 會停用編譯程式在物件建立時檢查所有 required 成員是否已初始化的功能。 請謹慎使用。

下列程式代碼顯示一個類別階層,使用 required 修飾詞來修飾 FirstNameLastName 屬性:

public class Person
{
    public Person() { }

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

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

    public int? Age { get; set; }
}

public class Student : Person
{
    public Student() : base()
    {
    }

    [SetsRequiredMembers]
    public Student(string firstName, string lastName) :
        base(firstName, lastName)
    {
    }

    public double GPA { get; set; }
}

如需必要成員的詳細資訊,請參閱 C#11 - 必要成員 功能規格。