在去年PDC2005上,在發布C#2.0 (C# Whidbey)的同時,微軟也同時展示了它 們在C# 3.0上的一些計劃。在提到一系列新的語言特性如語言集成查詢(LINQ)等 ,Redmond同時也介紹了一個新的特性--匿名類型。本文詳細介紹了匿名類型。
匿名類型定義
C#3.0規范將匿名類型描述為從對象初始化器 (object initializer)自動推斷和生成的元組類型。在你能夠充分領會這一定義 之前,你需要了解"對象初始化器"的概念,它是匿名類型特性的基礎 。
對象初始化器給一個對象的一個或者多個域或者屬性指定值。這就意 味著你可以通過一系列諸如{a=10,b=20}這樣的賦值操作指定某個對象的一系列 屬性。換句話來說,一個匿名類型是原來不存在的,並且沒有在代碼中明確指定 的。
注意,編譯器是在編譯時創建匿名類型而非運行時。
你可以 通過ILDASM(IL分解器)來分解獲得:
var p1 = new {Name = "A", Price = 3};
在編譯時刻,編譯器使用對象初始 化器推斷的屬性來傳見一個新的匿名類型。因而,新類型將會擁有Name和Price 的屬性。Get和Set方法和保存這些屬性的相應的私有變量,會自動的生成。在運 行時,此類型的一個實例會被創建,這個實例的屬性將會被設置為對象初始化器 中指定的值。
C#內部
你可能很驚奇的發現,你可以只定義一些屬 性的名稱以及它們的值,C# 3.0會自動的從它們那裡創建類。這是怎麼做到的呢 ?檢查一下編譯器的處理吧。
這樣開始一行代碼:
var p1 = new {Name = "A", Price = 3};
當C# 3.0編譯器遇 到這樣的一個請求的時候,它將在後台將其轉化成更加清楚的表達,如下:
class __Anonymous1
{
private string name ;
private int price;
public string Name{ get { return name; } set { name = value ; } }
public int Price{ get { return price; } set { price= value ; } }
}
__Anonymous1 p1 = new __Anonymous1();
p1.Name = "A";
pt.Price =3
實例學習
你需要安裝Visual Studio 2005和.Net 2.0 ,然後你可以從這裡下載到LINQ技術的預覽版本。
如果你安裝了Visual Studio 2005,你可以看到在Visual C#下多了3個和LINQ預覽有關的工程模板: LINQ Console Application, LINQ Windows Application, 和LINQ Library。