| 版本 | 語法 | 說明 |
|---|---|---|
| C# 3.0 | public int Age { get; set; } | 基本自動屬性 |
| C# 6.0 | public int Age { get; set; } = 18; | 初始化器 |
| C# 7.0 | public int Age { get; private set; } | 存取子不同存取級別 |
| C# 9.0 | public int Age { get; init; } | init 僅建構/初始化器可設定 |
| C# 11 | public required int Age { get; init; } | 編譯期強制初始化 |
.class public auto ansi Employee
{
.field private int32 '<Age>k__BackingField'
.field private string '<Name>k__BackingField'
.property instance int32 Age()
{
.get instance int32 Employee::get_Age()
.set instance void Employee::set_Age(int32)
}
.property instance string Name() { ... }
.method public hidebysig specialname instance int32 get_Age() cil managed
{
ldarg.0
ldfld int32 Employee::'<Age>k__BackingField'
ret
}
.method public hidebysig specialname instance void set_Age(int32 value) cil managed
{
ldarg.0
ldarg.1
stfld int32 Employee::'<Age>k__BackingField'
ret
}
}
關鍵點:編譯器自動產生 **支援欄位** (<PropertyName>k__BackingField) 並標記 [CompilerGenerated]。
[Obsolete] 標記在屬性上會同時套用到 get/set;需分別標記存取子 (C# 7.3+ [property: Obsolete])。struct 的自動屬性預設值為 0/null,若需非零預設值必須在建構函式明確設定 (結構體無無參建構函式)。DataContractSerializer 需 [DataMember] 標記支援欄位。
abstract class Base
{
public abstract string Name { get; set; } // 必須同時有 get/set,衍生類別實作
}
class Derived : Base
{
public override string Name { get; set; } // 這裡也是自動屬性
}
get; private set; 或 get; init; 表達「建構後不變」語意。required 關鍵字編譯期強制呼叫端提供值。INotifyPropertyChanged、延遲初始化、相依屬性計算等。record 提供完整不可變、值相等、with-expression、解構,替代大部分 DTO/實體類別。自動實作屬性是 C# 最成功的語法糖之一,編譯器透明生成支援欄位與存取子,IL 層面與手寫屬性無異。理解其生成機制、限制與現代擴充 (init, required, record),能寫出更簡潔、語意更精確的程式碼。