修 required 飾符表示所適用 的欄位 或 屬性 必須由 物件初始化器初始化。 任何初始化類型新實例的表達式都必須初始化所有必要成員。
required這個修飾符從 C# 11 開始可用。
C# 語言參考資料記錄了 C# 語言最新版本。 同時也包含即將推出語言版本公開預覽功能的初步文件。
文件中標示了語言最近三個版本或目前公開預覽版中首次引入的任何功能。
小提示
欲查詢某功能何時首次在 C# 中引入,請參閱 C# 語言版本歷史的條目。
透過使用修 required 飾符,開發者可以建立必須正確初始化屬性或欄位的型別,同時仍允許透過物件初始化器初始化。 數個規則可確保此行為:
- 將修飾符套用
required在 以及structclass類型中宣告的欄位和屬性,包括record和record struct類型。 你無法將修required飾符套用在 的成員interface身上。 - 你無法將明確的介面實作標記為
required。 你無法在物件初始化器中設定它們。 - 你必須初始化必要的成員,但你可以初始化成
null。 如果類型是不可為 Null 的參考型別,如果您將成員初始化為null,編譯程式會發出警告。 如果成員完全未初始化,編譯程式就會發出錯誤。 - 必須的成員必須至少與其包含的類型一樣可見。 例如,一個
public類別無法包含required的protected欄位。 此外,必要屬性必須有設置器(set或init存取子),其能見度至少應與包含類型相當。 建立實例的程式碼無法設定無法存取的成員。 - 衍生類別無法隱藏基類中宣告的
required成員。 隱藏必要成員會防止呼叫端使用物件初始設定器。 此外,覆寫必要屬性的衍生型別必須包含required修飾詞。 衍生類型無法移除required狀態。 在覆寫屬性時,衍生型別可以新增required修飾符。 - 當型別參數包含約束時
new(),你不能用任何成員required的型別作為型別參數。 編譯程式無法強制在泛型程式代碼中初始化所有必要的成員。 - 你不能在宣告中使用
required該修飾符來設定紀錄的位置參數。 您可以為包含required修飾詞的位置屬性新增明確的宣告。
某些類型,例如 位置紀錄,使用主要建構函式來初始化位置屬性。 如果其中任一屬性包含 required 修飾詞,主要建構函式會新增 SetsRequiredMembers 屬性。 此屬性表示主要建構子初始化所有所需成員。 您可以使用 System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute 屬性撰寫自己的建構函式。 不過,編譯程式不會確認這些建構函式會初始化所有必要的成員。 相反地,屬性宣告給編譯程式,建構函式會初始化所有必要的成員。
SetsRequiredMembers 屬性會將這些規則新增至建構函式:
- 一個用
SetsRequiredMembers或this()屬性註釋的建構函式,如果鏈結到另一個用base()屬性註釋的建構函式,則也必須包含SetsRequiredMembers屬性。 這可確保呼叫端能夠正確使用所有適當的建構函式。 - 如果
record型別的成員中有任何屬於SetsRequiredMembers,則產生的複製建構函式會套用required屬性。
警告
這個 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 - 必要成員 功能規格。