c#匿名型別最簡單的例子 自動協助我們建立類
來源:互聯網
上載者:User
在去年PDC2005上,在發布C#2.0 (C# Whidbey)的同時,微軟也同時展示了它們在C# 3.0上的一些計劃。 在提到一系列新的語言特性如Language-integrated Query (LINQ)(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。 你可以這樣建立一個使用匿名型別的工程: 1. 開啟Visual Studio 2005編輯器,建立一個新工程,選擇LINQ Console作為工程模板; 2. 將新工程命名為AnonTypes並且點擊OK; 3. 在編輯器裡輸入如下代碼:// Program.csusing System;using System.Query;using System.Data.DLinq;namespace AnonTypes{ class Program { static void Main(string[] args) { var p1 = new {Name = "A", Price = 3}; Console.WriteLine("Name = {0}\nPrice = {1}",p1.Name, p1.Price); Console.ReadLine(); } }} 4. 編譯器 5. 執行程式,獲得如下結果:Name = APrice = 3 如果你沒有Visual Studio 2005,你仍然可以通過命令列來編譯你的代碼:C:\Program Files\LINQ Preview\Bin\Csc.exe/reference:"C:\Program Files\LINQ Preview\Bin\System.Data.DLinq.dll"/reference: System.dll/reference:"C:\Program Files\LINQ Preview\Bin\System.Query.dll"/out:AnonTypes.exe /target:exe Program.cs 儘管你沒有清晰的在代碼裡定義一個類,但是C#編譯器自動做了如下工作: 1. 解析類型 2. 建立一個新的類(擁有name和price屬性) 3. 使用這個類來初始化一個新對象 4. 將傳來的參數指定給對象