必要修飾詞 (C# 參考)
required
修飾詞指出,所套用的 字段 或 屬性,必須由 物件初始化表達式進行初始化。 任何初始化類型新實例的表達式都必須初始化所有必要成員。 從 C# 11 開始,可以使用 required
修飾詞。
required
修飾詞可讓開發人員建立必須正確初始化屬性或欄位的類型,但仍允許使用物件初始化表達式進行初始化。 數個規則可確保此行為:
-
required
修飾詞可以套用至 欄位, 和 屬性 在struct
中宣告,以及class
類型,包括record
和record struct
類型。required
修飾詞無法套用至interface
的成員。 - 明確介面實作無法標示為
required
。 無法在物件初始化表示式中設定它們。 - 必要成員必須初始化,但可能會初始化為
null
。 如果類型是不可為 Null 的參考型別,如果您將成員初始化為null
,編譯程式會發出警告。 如果成員完全未初始化,編譯程式就會發出錯誤。 - 必須的成員必須至少與其包含的類型一樣可見。 例如,一個
public
類別無法包含protected
的required
欄位。 此外,必要屬性必須有設置器(set
或init
存取子),其能見度至少應與包含類型相當。 無法存取的成員無法由建立實例的程式代碼設定。 - 衍生類別無法隱藏基類中宣告的
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
修飾詞來修飾 FirstName
和 LastName
屬性:
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 - 必要成員 功能規格。