理解C#中的屬性
C# 11在.NET 7中引入了一個令人興奮的屬性新增功能:required關鍵字。 在這篇文章中,我們將探索C#屬性,使用Tim Corey的簡潔影片教程中的例子".NET 7更新:在不到10分鐘內瞭解必需屬性"。 我們將從屬性的基礎知識到新的required關鍵字以及如何幫助強制初始化規則的所有內容進行拆解。
C# 屬性
在C#中,屬性允許您封裝字段並管理對物件類資料成員的存取。 它們通常用於確保資料完整性,同時允許外部存取。 一個私有字段可以使用屬性封裝,提供對資料的存取或修改的控制。 公共字串屬性通常使用稱為存取器(get和set)的特殊方法來高效地操縱類成員。 在C#中,靜態屬性可以在不實例化類的情況下進行存取,提供了一種管理屬性值的獨特方式。
以下是Tim設置的一個簡單屬性例子以示範。
建立一個控制台應用程式
首先,Tim使用C# 11建立了一個基本的.NET 7控制台應用程式。該版本引入了required關鍵字,這在之前的.NET版本中不可用。
定義一個簡單的模型
Tim建立了一個LastName設置屬性:
public class PersonModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}public class PersonModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}這些屬性允許PersonModel儲存名字和姓氏。 然而,在沒有其他設置的情況下,LastName可能會未初始化,導致空值。
使用構造函式確保初始化
一種常見的方法是通過構造函式來確保屬性始終被初始化。 在Tim的例子中,他在LastName:
public PersonModel(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}public PersonModel(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}這種方法強制要求每當建立LastName。 如果我們嘗試建立PersonModel而不指定這些值,編譯器會將其標記為錯誤。
可空上下文
從.NET 6和C# 10開始,C#引入了可空引用型別。這意味著屬性需要要麼初始化,要麼用?明確標記為可空。 例如,如果LastName可以為空,我們會定義如下:
public string? FirstName { get; set; }
public string? LastName { get; set; }public string? FirstName { get; set; }
public string? LastName { get; set; }然而,在Tim的例子中,我們假設LastName應該始終為非空。 起初,可空性是通過謹慎的初始化或可空註釋來處理的,但在C# 11中,我們有了更強大的選項。
引入required關鍵字
雖然構造函式可以強制初始化,但C# 11引入了required關鍵字,使得確保特定屬性被設置變得更容易。 使用required,您可以將單個屬性標記為必需,這意味著在物件初始化期間必須為其分配值。
設置必需屬性
為使PersonModel類如下:
public class PersonModel
{
public required string FirstName { get; set; }
public required string LastName { get; set; }
}public class PersonModel
{
public required string FirstName { get; set; }
public required string LastName { get; set; }
}通過用required標記這些屬性,編譯器現在將強制要求它們通過物件初始化器或構造函式進行設置。 這很有用,因為它讓您可以要求特定的屬性,而不需要建立構造函式。
必需屬性的範例使用
現在,我們可以如下建立和初始化PersonModel:
PersonModel person = new() { FirstName = "Tim", LastName = "Corey" };PersonModel person = new() { FirstName = "Tim", LastName = "Corey" };如果我們省略LastName,編譯器會標記一個錯誤,提示我們初始化這些必需屬性。
將required與構造函式一起使用
Tim演示了一個使用required屬性和構造函式的情況。 在有構造函式設置必需屬性的情況下,C#需要確保在調用構造函式時這些屬性仍然被初始化。
在這種情況下,可以使用SetsRequiredMembers特性來表示構造函式符合必需的條件。 以下是Tim應用的方法:
[SetsRequiredMembers]
public PersonModel()
{
FirstName = "Test";
LastName = "Test";
}
[SetsRequiredMembers]
public PersonModel(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}[SetsRequiredMembers]
public PersonModel()
{
FirstName = "Test";
LastName = "Test";
}
[SetsRequiredMembers]
public PersonModel(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}新增SetsRequiredMembers通知編譯器這些屬性將在構造函式中設置,避免初始化錯誤。 此功能有助於防止意外遺漏,同時允許靈活設置屬性初始化的方式。
為什麼required屬性很有用
Tim解釋了新的required關鍵字簡化了確保屬性始終被設置的過程。 不必在每個情況下需要構造函式設置方法或冒著未設置屬性的風險,現在我們有了一種直接在屬性聲明中要求特定值的簡單方法。
這個功能在資料模型中大放異彩,其中某些字段是必需的,並且可以幫助在開發過程的早期通過防止運行時空值錯誤來捕獲問題。
附加屬性範例
然後Tim新增了一個可選屬性,Email,它可以是可空的:
public string? Email { get; set; }public string? Email { get; set; }由於它不標記為Email`屬性可以保持未設置而不會導致編譯器錯誤。 通過這個例子,Tim演示了它允許有關鍵和選擇性資料字段的清晰區別的一個類別的靈活性。
結論
在C# 11中引入的必需屬性是開發者的一個寶貴功能,確保重要的屬性始終被初始化。 Tim Corey的影片對此功能提供了很好的介紹,並展示了它在控制台應用程式中的運行方式。 通過將required關鍵字與物件初始化器和構造函式結合使用,我們可以在C#中建立更強大和更安全的資料模型。 更多資訊豐富的教程,請造訪Tim的YouTube頻道。

