自動實作的屬性
當屬性存取子中不需要其他邏輯時,自動實作屬性會使屬性宣告更加簡潔。 它們還可讓用戶端程式碼建立物件。 當您宣告屬性時,如下列範例所示,編譯器會建立私用、匿名的支援欄位,但只能透過屬性的 get
和 set
存取子才能存取。 init
存取子也可以宣告為自動實作的屬性。
下列範例顯示具有一些自動實作屬性的簡單類別:
// This class is mutable. Its data can be modified from
// outside the class.
public class Customer
{
// Auto-implemented properties for trivial get and set
public double TotalPurchases { get; set; }
public string Name { get; set; }
public int CustomerId { get; set; }
// Constructor
public Customer(double purchases, string name, int id)
{
TotalPurchases = purchases;
Name = name;
CustomerId = id;
}
// Methods
public string GetContactInfo() { return "ContactInfo"; }
public string GetTransactionHistory() { return "History"; }
// .. Additional methods, events, etc.
}
class Program
{
static void Main()
{
// Initialize a new object.
Customer cust1 = new Customer(4987.63, "Northwind", 90108);
// Modify a property.
cust1.TotalPurchases += 499.99;
}
}
您無法在介面中宣告自動實作的屬性。 自動實作和欄位支援的屬性會宣告私用實例支援欄位,而且介面無法宣告實例欄位。 在介面中宣告屬性,而不定義主體會宣告具有存取子的屬性。 實作該介面的每個類型都必須實作該屬性。
您可以初始化自動實作的屬性,類似於欄位:
public string FirstName { get; set; } = "Jane";
先前範例中顯示的類別可變動。 用戶端程式碼可以在物件建立後變更物件中的值。 複雜類別如果包含重要行為 (方法) 和資料,通常需要具有公用屬性。 不過,如果是只會封裝一組值 (資料) 且只有很少或沒有任何行為的小型類別或結構,您應使用下列任一選項來讓物件變成不可變動:
- 只宣告
get
存取子 (在建構函式以外的所有位置皆不可變)。 - 宣告
get
存取子及init
存取子 (除了在物件建構期間以外,在所有位置皆不可變)。 - 將
set
存取子宣告為 private (對取用者而言不可變)。
如需詳細資訊,請參閱 如何使用自動實作的屬性來實作輕量型類別。
您可能需要將驗證新增至自動實作的屬性。 C# 13 會將字段支援的屬性新增為預覽功能。 您可以使用 field
關鍵詞來存取自動實作屬性的編譯程式合成支援欄位。 例如,您可以確定 FirstName
上述範例中的 屬性無法設定為 null
或空字串:
public string FirstName
{
get;
set
{
field = (string.IsNullOrWhiteSpace(value) is false
? value
: throw new ArgumentException(nameof(value), "First name can't be whitespace or null"));
}
} = "Jane";
這項功能可讓您將邏輯新增至存取子,而不需要明確宣告支援字段。 您可以使用 field
關鍵詞來存取編譯程式所產生的支援欄位。
重要
關鍵詞 field
是 C# 13 中的預覽功能。 您必須使用 .NET 9,並將項目 <LangVersion>
檔中的 元素設定為 preview
,才能使用 field
內容關鍵詞。
您應該小心在 field
類別中使用關鍵詞功能,其具有名為 field
的欄位。 新的 field
關鍵詞會遮蔽屬性存取子範圍中名為 field
的欄位。 您可以變更變數的名稱 field
,或使用 @
權杖將識別元參考 field
為 @field
。 您可以閱讀 關鍵詞的功能規格field
來深入瞭解。