傳統做法需撰寫 GetXxx()/SetXxx() 方法封裝私有欄位。C# 屬性提供語法糖,讓呼叫端如同存取公開欄位般自然,同時保留封裝彈性 (驗證、通知、延遲載入等)。
public class PropertyHolder
{
private int someProperty = 0; // 背景欄位
public int SomeProperty // 屬性名稱慣用 PascalCase
{
get { return someProperty; }
set { someProperty = value; } // value 為隱含參數
}
}
// 使用方式
PropertyHolder ph = new PropertyHolder();
ph.SomeProperty = 5; // 呼叫 set
Console.WriteLine(ph.SomeProperty); // 呼叫 get
public class PropertyHolder
{
private int someProperty;
public PropertyHolder(int val) { someProperty = val; }
public int SomeProperty
{
get { return someProperty; } // 僅提供 get
}
}
// 呼叫端
PropertyHolder ph = new PropertyHolder(5);
Console.WriteLine(ph.SomeProperty); // OK
// ph.SomeProperty = 7; // 編譯錯誤:無 set 存取子
public class PropertyHolder
{
private int someProperty;
public int SomeProperty
{
set
{
someProperty = value;
Console.WriteLine("Value set to {0}", someProperty);
}
}
}
// 呼叫端
PropertyHolder ph = new PropertyHolder();
ph.SomeProperty = 5; // 僅能設定,無法讀取
編譯器自動產生背景欄位,適合無額外邏輯的單純封裝:
public class Person
{
public string Name { get; set; }
public int Age { get; private set; } // 可分別設定存取層級
}
| 情境 | 建議 |
|---|---|
| 公開 API、需驗證/通知/延遲載入、序列化控制 | 屬性 |
| 內部實作細節、高效能熱路徑、無封裝需求 | 私有/受保護欄位 |
public int Score { get; set; } = 100; (C# 6+)public int Double => value * 2; (唯讀)public string Id { get; init; } 僅允許物件初始化器設定。public required string Email { get; set; } 強制建構時指定。