用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
ekinyang的公告
文章分类
    存档

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

     

    发表于 @ 2008年03月15日 16:06:00 | 评论( loading... ) | 编辑| 举报| 收藏

    新一篇:Enterprise library Data Access Application Block试用手记

    • 发表评论
    • 评论内容:
    •  
    Copyright © ekinyang
    Powered by CSDN Blog