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 c1.CustomerID = "C0001"; c1.CustomerName = "NewCustomer"; c1.CustomerBirthday = DateTime.Now; |
C#3.0提出了物件初始化器(Object initializers)的概念,可以指定一個或多個物件的域或屬性的值。如:以上的程式碼可以寫成:
var c2 = new Customer() { CustomerID = "C0001", CustomerName = "NewCustomer" |
以上兩者在編譯器級別上沒有任何區別,我們可以看看IL程式碼的截圖:
在第一個和第二個紅色框中呼叫了Customer類的構造方法,然後逐一的對屬性進行賦值。由此可見兩中初始化物件的方式完全一樣。
二、匿名型別
C#3.0允許new操作符與匿名物件初始化器聯用來建立一個匿名型別的物件。匿名物件初始化器宣告一個匿名型別並返回這個型別的例項。當我們在程式中宣告這樣的匿名型別時
var cu = new { CustomerID = "C0001", CustomerName = "NewCustomer" |
實際上編譯器首先會在生成的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程式碼則是上面編譯器建立的一個型別。我們在提到物件初始化器時候建立了c1和c2這兩個物件,從IL程式碼中可以看出他們是Customer型別的,而cu物件則是<>f_AnonymousType0`3型別。