C# 3.0 引入自動實作屬性與物件初始化器,兩大特性結合讓資料類別定義與實例化大幅精簡,消除了大量欄位宣告、屬性存取器與建構函式多載的樣板程式碼。
public class Employee
{
private int _id;
private string _name;
private string _sex;
private int _age;
private string _birthDate;
public int Id { get { return _id; } set { _id = value; } }
public string Name { get { return _name; } set { _name = value; } }
public string Sex { get { return _sex; } set { _sex = value; } }
public int Age { get { return _age; } set { _age = value; } }
public string BirthDate { get { return _birthDate; } set { _birthDate = value; } }
}
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public string Sex { get; set; }
public int Age { get; set; }
public string BirthDate { get; set; }
}
編譯器生成: 為每個自動屬性產生隱私備份欄位(命名如 <Id>k__BackingField)與標準 get/set 存取子。IL 代碼體積與手寫版本相近,但原始碼減少 2/3 以上。
// 唯讀自動屬性(僅 get,建構函式或初始化器設定)
public string Id { get; }
// 含預設值初始化(C# 6.0)
public int Age { get; set; } = 18;
Employee emp = new Employee();
emp.Id = 1;
emp.Name = "藍之風";
emp.Age = 24;
emp.BirthDate = "1984-10-21";
emp.Sex = "男";
Employee emp = new Employee
{
Id = 1,
Name = "藍之風",
Age = 24,
BirthDate = "1984-10-21",
Sex = "男"
};
編譯器轉換: 建立暫存變數、呼叫無參數建構函式、逐一指派屬性、指派給目標變數。IL 中可見 stloc.1 暫存、callvirt set_Property 序列。
| 指標 | 傳統寫法 | C# 3.0 寫法 |
|---|---|---|
| 類別定義行數 | ~35 行 | ~10 行 |
| 實例化行數 | 6 行 | 1 陳述式 |
| 建構函式多載需求 | 高(各種參數組合) | 低(單一無參數建構函式即可) |
| IntelliSense 支援 | 完整 | 完整 |
| 執行效能 | 基準 | 相同(編譯期轉換) |
private set 或 init(C# 9+)[DataMember] 標記備份欄位