C# 14 新功能:field 關鍵字

C# 14 的新特性:field 關鍵字。


C# 14 引入了 field 關鍵字,讓你在屬性存取器中可以直接存取編譯器產生的背後欄位(backing field),無需手動宣告私有欄位。這是自動實作屬性的一個重大改進。


以往寫法

在 C# 14 之前,如果需要在 setter 中加入驗證邏輯,你必須手動宣告私有欄位:

// C# 13 及更早版本
private int _age;

public int Age
{
    get => _age;
    set
    {
        if (value < 0) throw new ArgumentException("年齡不可為負數!");
        _age = value;
    }
}

現代寫法

從 C# 14 開始,使用 field 關鍵字,可以省去私有欄位的宣告:

// C# 14:使用 field 關鍵字
public int Age
{
    get;  // 編譯器自動產生 getter
    set
    {
        if (value < 0) throw new ArgumentException("年齡不可為負數!");
        field = value;  // field 代表編譯器產生的背後欄位
    }
}


這種寫法的優點:

  1. 減少樣板程式碼:不需要另外宣告私有欄位和命名。
  2. 降低出錯機會:自動屬性與驗證邏輯可以共存,不會因為忘記使用正確的欄位名稱而出錯。
  3. 重構更安全:屬性重新命名時,不需要同時修改私有欄位名稱。


要提醒的是,field 關鍵字只能在自動實作屬性的存取器(accessor)中使用,如 getsetinit。如果你已經手動宣告了私有欄位(如 private int _age;),則不能使用 field 關鍵字。

以下是錯誤示範:

public class Person
{
    // ✗ 錯誤示範:手動宣告欄位後不能用 field
    private int _count;
    public int Count
    {
        get => field;  // ✗ 編譯錯誤!因為不是自動實作屬性
        set => _count = value;
    }
}


更多範例:

public class Person
{
    // 唯讀屬性:只有 getter 使用 field
    public string Id { get; } = Guid.NewGuid().ToString();

    // 帶驗證的屬性
    public string Name
    {
        get;
        set => field = value ?? throw new ArgumentNullException(nameof(value));
    }

    // 帶通知的屬性(常見於 MVVM)
    public string Email
    {
        get;
        set
        {
            if (field != value)
            {
                field = value;
                OnPropertyChanged();
            }
        }
    }

    private void OnPropertyChanged([CallerMemberName] string? name = null) { }
}


注意

如果你的類別中已有一個名為 field 的成員(欄位、屬性、方法等),可以使用 @field 或 this.field 來區分。


最後來一張 NotebookLM 對本文的摘要總結:



亦可參考微軟文件:〈C# 14 的新功能- field 關鍵詞〉

Keep learning!

沒有留言:

技術提供:Blogger.
回頂端⬆️