C# 3.0 引入的自動實作屬性與匿名類型大幅簡化程式碼撰寫。本文深入剖析其語法、編譯器實作細節、使用限制與最佳實務。
傳統寫法需宣告私有欄位配合 get/set:
private int m_one;
public int One { get { return m_one; } set { m_one = value; } }
C# 3.0 簡化為:
public int One { get; set; } // 編譯器自動產生背端欄位
private setprivate set 屬性以物件初始化器語法建立唯讀屬性集合:
var noname = new { name = "yyao", age = 24 };
var qname = new { namea = "selfcherish", age = 25 };
var gname = new { username = "selfcherish", age = 25 };
qname = noname; // 合法:屬性名稱、順序、型別相同
gname = qname; // 錯誤:屬性名稱不同(username vs namea)
編譯器將匿名類型轉換為一般類別:
class <>f__AnonymousType0`2 {
private string name;
private int age;
public string Name { get { return name; } set { name = value; } }
public int Age { get { return age; } set { age = value; } }
}
<>f__AnonymousType0`2 noname = new <>f__AnonymousType0`2();
noname.Name = "dd"; noname.Age = 24;
透過 ILDasm 反組譯可觀察產生的泛型型別 <>f__AnonymousType0`2<string,int32>。


匿名類型覆寫 Equals 與 GetHashCode,僅比較屬性值:
var noname = new { namea = "yyao", age = 24 };
var qname = new { namea = "yyao", age = 24 };
Console.WriteLine(qname == noname); // False:參考比較
Console.WriteLine(qname.Equals(noname)); // True:值比較
Console.WriteLine(qname.GetHashCode() == noname.GetHashCode()); // True
自動屬性 public string Name { get; set; } 編譯器產生隱藏欄位 <Name>k__BackingField。
掌握這些特性的編譯器行為,有助於除錯、效能調優與避免常見誤區。