1. 程式人生 > >C#3.0物件初始化器和匿名型別

C#3.0物件初始化器和匿名型別

一、物件初始化器

C#3.0允許new操作符與匿名物件初始化器聯用來建立一個匿名型別的物件。

如下有一個Customer類的定義。

public class Customer

{

public string CustomerID { get; set; }

public string CustomerName { get; set; }

public DateTime CustomerBirthday { get; set; }

     }

C#2.0及以前的版本中如果需要建立一個Customer類的例項,並初始化類的成員需要以下的操作:

Customer c1 = new

Customer();

c1.CustomerID = "C0001";

c1.CustomerName = "NewCustomer";

c1.CustomerBirthday = DateTime.Now;

C#3.0提出了物件初始化器(Object initializers)的概念,可以指定一個或多個物件的域或屬性的值。如:以上的程式碼可以寫成:

var c2 = new Customer() { CustomerID = "C0001", CustomerName = "NewCustomer"

, CustomerBirthday = DateTime.Now };

以上兩者在編譯器級別上沒有任何區別,我們可以看看IL程式碼的截圖:

在第一個和第二個紅色框中呼叫了Customer類的構造方法,然後逐一的對屬性進行賦值。由此可見兩中初始化物件的方式完全一樣。

二、匿名型別

C#3.0允許new操作符與匿名物件初始化器聯用來建立一個匿名型別的物件。匿名物件初始化器宣告一個匿名型別並返回這個型別的例項。當我們在程式中宣告這樣的匿名型別時

var cu = new { CustomerID = "C0001", CustomerName = "NewCustomer"

, CustomerBirthday = DateTime.Now };

實際上編譯器首先會在生成的IL程式碼中建立一個型別。

<>f_AnonymousType0`3<`CustomerID>j__TPar','<CustomerName>j__TPar','<CustomerBirthday>j__TPar'>

.locals init ([0] class ConsoleApplication1.Customer c1,

[1] class ConsoleApplication1.Customer c2,

[2] class '<>f__AnonymousType0`3'<string,string,valuetype [mscorlib]System.DateTime> cu,

[3] class ConsoleApplication1.Customer '<>g__initLocal0')

而當我們宣告cu這樣一個物件的時候生成的IL程式碼則是上面編譯器建立的一個型別。我們在提到物件初始化器時候建立了c1c2這兩個物件,從IL程式碼中可以看出他們是Customer型別的,而cu物件則是<>f_AnonymousType0`3型別。