跳過到頁腳內容
Iron Academy Logo
學習 C#
學習 C#

其他分類

理解 C# 屬性

Tim Corey
9m 50s

C# 11在.NET 7中引入,給屬性帶來了一個令人興奮的新增項:required關鍵字。 在本文中,我們將探討C#屬性,使用來自Tim Corey的簡潔視頻教程中的範例〈.NET 7 更新:在10分鐘或更短時間內的Required Properties"。 我們將從屬性的基本知識分解到新的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可能會被留作未初始化狀態,導致null值。

使用建構函式確保初始化

一種確保屬性始終被初始化的常見方法是通過建構函式。 在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可以為null,我們會將它們定義如下:

public string? FirstName { get; set; }
public string? LastName { get; set; }
public string? FirstName { get; set; }
public string? LastName { get; set; }

不過,在Tim的範例中,我們假設LastName應始終為非null。 最初的空性處理是通過謹慎的初始化或可空註解來實現的,但有了C# 11,我們有了更強大的選擇。

引入required關鍵字

雖然建構函式可以強制初始化,C# 11引入了required關鍵字,使確保特定屬性被設定變得更簡單。 使用required,您可以將單個屬性標記為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標記這些屬性,編譯器現在將強制它們通過物件初始化器或建構函式進行設定。 這很有用,因為它讓您可以要求特定的屬性而不需要創建建構函式。

有required屬性的範例使用

現在,我們可以這樣創建和初始化PersonModel

PersonModel person = new() { FirstName = "Tim", LastName = "Corey" };
PersonModel person = new() { FirstName = "Tim", LastName = "Corey" };

如果我們省略LastName,編譯器會標記錯誤,提示我們初始化這些required屬性。

將required用於建構函式

Tim演示了一個情況,該情況使用了required屬性和建構函式。 在您有一個設定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關鍵字簡化了確保屬性總是被設定的過程。 除了不需要在每個情況下為設定方法使用建構函式或冒著屬性未設定的風險,我們現在有一種簡單的方法可以直接在屬性聲明中要求特定的值。

在某些欄位是必需的數據模型中,該功能大放異彩,且能幫助在開發過程中通過防止運行時null錯誤提早抓住問題。

其他屬性範例

Tim隨後添加了一個選用屬性,Email,可以為null:

public string? Email { get; set; }
public string? Email { get; set; }

因為它沒有用Email屬性可以保持未設定而不會導致編譯器錯誤。 在這個例子中,Tim演示了它對類的靈活性,其在必要數據欄位和選用數據欄位之間有明確區分。

結論

C# 11中required屬性的增加是對開發者的一個有價值的功能,確保必要屬性總是被初始化。 Tim Corey的視頻提供了此功能的絕佳介紹,並示範了它如何在控制台應用程式中運作。 結合required關鍵字與物件初始化器和建構函式,我們可以在C#中創建更堅固和安全的數據模型。 欲了解更多信息豐富的教程,請訪問Tim的YouTube頻道

Hero Worlddot related to 理解 C# 屬性
Hero Affiliate related to 理解 C# 屬性

通過分享您所愛的東西賺得更多

您是否在為使用.NET、C#、Java、Python或Node.js的開發者創建內容?將您的專業知識轉化為額外收入!

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我