自動實作屬性不能用 abstract 修飾:
abstract class People
{
public abstract string Name { get; set; } // 抽象屬性:合法
public abstract int Age { get; set; }
}
// 自動屬性寫法:
// public string Name { get; set; } // 非抽象,編譯器會自動產生後端欄位
必須同時提供 get 與 set 存取子,否則編譯錯誤:
public string Name { get; } // 錯誤:自動屬性必須有 get 和 set
若需唯讀,請改用傳統屬性寫法搭配 readonly 欄位,或將 set 設為 private。
這是自動屬性的一大優勢:
public int Age { get; private set; } // 外部可讀,內部可寫
null,值型別為 0、false 等。public Employee(string name, int age)
{
this.Name = name;
this.Age = age;
}
自動屬性無法在 get/set 中加入自訂邏輯(如範圍檢查)。此時必須回傳傳統寫法:
private int _age;
public int Age
{
get { return _age; }
set
{
if ((value > 0) && (value < 500))
_age = value;
else
throw new ArgumentOutOfRangeException("你不是人!");
}
}
自動實作屬性極大簡化了單純資料封裝的程式碼,但不是萬能鑰匙:需要驗證、計算、側效應等邏輯時,仍須手寫完整屬性。