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 代表編譯器產生的背後欄位
}
}
這種寫法的優點:
- 減少樣板程式碼:不需要另外宣告私有欄位和命名。
- 降低出錯機會:自動屬性與驗證邏輯可以共存,不會因為忘記使用正確的欄位名稱而出錯。
- 重構更安全:屬性重新命名時,不需要同時修改私有欄位名稱。
要提醒的是,field 關鍵字只能在自動實作屬性的存取器(accessor)中使用,如 get、set、init。如果你已經手動宣告了私有欄位(如 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!
沒有留言: