| 寫法 | 程式碼 | 特性 |
|---|---|---|
| 手動封裝 (傳統) | | 可在 get/set 加入驗證、日誌、延遲載入等邏輯 |
| 自動屬性 (C# 3.0+) | | 編譯器自動產生隱藏後端欄位,語法簡潔 |
類別.A;自動屬性同樣透過 類別.A (非 類別.a,原問有誤)。兩者對外呼叫語法相同。if (value < 0) throw...);自動屬性預設直接存取後端欄位。<A>k__BackingField),若需特定序列化名稱,建議手動實作或加上 [DataMember(Name="A")]。
private int _a = 0;
public int A {
get => _a;
set {
if (value < 0) throw new ArgumentOutOfRangeException();
_a = value;
}
}
或使用 init 存取子 (C# 9.0) 實現不可變物件:
public int A { get; init; }
「所有欄位應宣告為 private,若需對外暴露,請封裝為屬性。對於簡單 get/set,編譯器會自動內聯,無效能損失。」
public int A { get; set; },簡潔且足夠 90% 情境。private 後端欄位。record 型別 (C# 9.0) public record Person(string Name, int Age);。public int a { get; set; } 這種小寫屬性名稱,違反 C# 命名慣例 (PascalCase)。