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类型。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值