首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 3.0 新特性深度解析(三):自動實作屬性與匿名類型完整指南

     編輯:關於C#

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; } // 編譯器自動產生背端欄位

關鍵規則

  • 必須同時宣告 get/set;唯讀屬性可用 private set
  • 類別內部仍可存取 private set 屬性
  • 不允許在自動屬性上附加 Attribute(需改用傳統寫法)

匿名類型

以物件初始化器語法建立唯讀屬性集合:

var noname = new { name = "yyao", age = 24 };

核心特性

  • 類別名稱由編譯器產生,原始碼不可存取
  • 屬性型別由編譯器推斷
  • 屬性唯讀,不可修改
  • 相同屬性名稱、順序、型別的匿名類型視為同一型別
  • 僅限方法區域內使用(不可作為欄位)
  • 不可包含 null 初始值

型別等價性驗證


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>。

ILDasm 工具介面

匿名類型 IL 碼

Equals 與 GetHashCode 行為

匿名類型覆寫 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。

掌握這些特性的編譯器行為,有助於除錯、效能調優與避免常見誤區。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved