首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Effective C# 原則 1:優先使用屬性而非欄位(下)

     編輯:關於C語言

屬性的進階優勢

3. 執行緒同步化

屬性存取器內建同步邏輯,呼叫端無感知:

private string _name;
public string Name
{
    get { lock (this) { return _name; } }
    set { lock (this) { _name = value; } }
}

靜態屬性同步用 lock (typeof(MyClass))。外部同步則需呼叫端自行管理,易遺漏且程式碼分散。

4. 抽象屬性支援繼承擴充

public abstract class Animal
{
    public abstract string Sound { get; }
}

public class Dog : Animal
{
    public override string Sound => "汪汪";
}

欄位無法宣告為 abstract,限制多型設計彈性。

5. 介面可定義屬性

public interface INamed
{
    string Name { get; set; }
}

介面不能包含欄位,使用屬性才能定義契約。

6. 索引器本質是屬性

public class Matrix
{
    private double[,] _data;
    public double this[int row, int col]
    {
        get => _data[row, col];
        set => _data[row, col] = value;
    }
}

索引器語法 this[] 即為屬性特殊形式,若不用屬性無法實作。

關鍵警示:不要直接將公開欄位改為屬性

C# 原始碼層級語法相同,但 IL 指令不同:

  • 欄位存取:ldfld / stfld
  • 屬性存取:callvirt get_Name / callvirt set_Name

直接改寫會導致二進位相容性中斷,所有參考該組件的程式碼必須重新編譯。設計時應直接使用屬性,而非「先用欄位、日後再改」。

效能迷思

雖然屬性比欄位多幾條 IL 指令(方法呼叫),但現代 CPU 執行極快,JIT 內聯最佳化會消除大部分開銷。可維護性遠大於微乎其微的效能差異。

總結

  • ✅ 設計新類型時預設使用屬性
  • ✅ 需要驗證、通知、同步、延遲載入時使用屬性
  • ✅ 介面、抽象類別、索引器必須用屬性
  • ❌ 公開 API 永不直接暴露欄位
  • ❌ 不要事後將公開欄位改為屬性(破壞二進位相容)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved