屬性是對欄位的封裝。將欄位設為 private,透過 public 的 get/set 存取器控制讀寫權限、驗證邏輯、延遲載入等,實現資料隱藏與封裝。
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
get/set 加入邏輯(驗證、日誌、快取)。public string Name { get; private set; }。Ctrl+R, Ctrl+E 自動產生屬性。public string Name { get; set; }
<Name>k__BackingField)。[DataMember] 或改用完整寫法。透過 IL 反編譯工具(ILSpy、dnSpy)可見,屬性編譯後變成兩個方法:
// get_Name
public string get_Name() { return this._name; }
// set_Name
public void set_Name(string value) { this._name = value; }
getName()/setName() 方法,.NET 用屬性語法糖簡化呼叫:obj.Name vs obj.get_Name()。get/set 本質上是 specialname 標記的方法,CLR 支援直接呼叫。// 僅建構子可設定
public string Id { get; } = Guid.NewGuid().ToString();
// C# 6+ 唯讀自動屬性
public DateTime CreatedAt { get; } = DateTime.Now;
public string FullName => $"{FirstName} {LastName}"; // 唯讀
public bool IsAdult => Age >= 18;
private int _age;
public int Age
{
get => _age;
set
{
if (value < 0 || value > 150) throw new ArgumentOutOfRangeException(nameof(Age));
_age = value;
}
}
private List _orders;
public List Orders
{
get
{
if (_orders == null) _orders = OrderService.GetByUserId(this.Id);
return _orders;
}
}
get; 配合建構子注入,減少可變狀態。GetOrders() 明確語意。.NET 屬性是「欄位封裝」的語法糖,編譯為 get_X/set_X 方法。自動實作屬性讓程式碼更精簡,但需注意序列化與效能陷阱。善用唯讀、運算式主體、驗證邏輯,能寫出更安全、可維護的程式碼。