您的位置:首页 > 编程语言 > C#

C#3.0对象初始化器和匿名类型

2008-03-15 16:06 246 查看

一、对象初始化器

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类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐