屬性存取器內建同步邏輯,呼叫端無感知:
private string _name;
public string Name
{
get { lock (this) { return _name; } }
set { lock (this) { _name = value; } }
}
靜態屬性同步用 lock (typeof(MyClass))。外部同步則需呼叫端自行管理,易遺漏且程式碼分散。
public abstract class Animal
{
public abstract string Sound { get; }
}
public class Dog : Animal
{
public override string Sound => "汪汪";
}
欄位無法宣告為 abstract,限制多型設計彈性。
public interface INamed
{
string Name { get; set; }
}
介面不能包含欄位,使用屬性才能定義契約。
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 / stfldcallvirt get_Name / callvirt set_Name直接改寫會導致二進位相容性中斷,所有參考該組件的程式碼必須重新編譯。設計時應直接使用屬性,而非「先用欄位、日後再改」。
雖然屬性比欄位多幾條 IL 指令(方法呼叫),但現代 CPU 執行極快,JIT 內聯最佳化會消除大部分開銷。可維護性遠大於微乎其微的效能差異。