首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 屬性封裝:手動實作 vs 自動屬性的差異與最佳實務

     編輯:程式設計綜合問答

兩種寫法對比

寫法程式碼特性
手動封裝 (傳統)
private int _a;
public int A {
    get { return _a; }
    set { _a = value; }
}
可在 get/set 加入驗證、日誌、延遲載入等邏輯
自動屬性 (C# 3.0+)
public int A { get; set; }
編譯器自動產生隱藏後端欄位,語法簡潔

核心差異

  • 存取方式:手動屬性透過 類別.A;自動屬性同樣透過 類別.A (非 類別.a,原問有誤)。兩者對外呼叫語法相同。
  • 可控性:手動屬性可攔截讀寫 (如範圍檢查 if (value < 0) throw...);自動屬性預設直接存取後端欄位。
  • 效能:JIT 會將簡單 get/set 內聯,無效能差異**。
  • 序列化/反射:自動屬性產生的後端欄位名稱不可預期 (如 <A>k__BackingField),若需特定序列化名稱,建議手動實作或加上 [DataMember(Name="A")]。

進階:自動屬性加入邏輯 (C# 7.0+)


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,編譯器會自動內聯,無效能損失。」

最佳實務總結

  1. **預設使用自動屬性** public int A { get; set; },簡潔且足夠 90% 情境。
  2. **需要驗證、副作用、相依屬性更新** 時,改用手動實作並加上 private 後端欄位。
  3. **資料傳輸物件 (DTO)** 可直接用自動屬性,甚至 record 型別 (C# 9.0) public record Person(string Name, int Age);。
  4. **避免** public int a { get; set; } 這種小寫屬性名稱,違反 C# 命名慣例 (PascalCase)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved