一、对象初始化器
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代码则是上面编译器创建的一个类型。我们在提到对象初始化器时候创建了c1和c2这两个对象,从IL代码中可以看出他们是Customer类型的,而cu对象则是<>f_AnonymousType0`3类型。