C#3.0新体验(三)对象与集合初始化器收

[转]http://blog.csdn.net/maotin/archive/2008/09/25/2977138.aspx

C#3.0新体验(三)

maotin

20080925

  前言:

      每天起得很早,花将近1.5个小时的路程来到公司,晚上下班到家基本上19:30以后;每天除了睡觉的7个多小时,有将近1/5时间在路上,呵呵,不知道有多少人和我一样,我想所谓大城市的快节奏是不是因为住得离公司太远,每天为了不迟到赶到公司,下班为了赶紧回家和家人一起吃饭而催生出来的;在这种环境生活不容易啊,每天地铁、公交的拥挤能把一天的好心情都挤没了,到了公司除了一身汗臭还有就是满肚的报怨(前天被个中年阿姨抢了位置,NND昨天又被高跟鞋踩了一脚);于是天天看着公交车外开过的一辆辆的小车那是相当羡慕啊,看着里面的帅哥美女,人家这日子过得多滋润;为了早日能有一部自己的小车,又得咬牙切齿的投入今天的工作!

     每天为了挑起学习、工作的动力,都要做一番战前动员思想工作!(思想觉悟还有待提高)

  四.对象与集合初始化器:

1.先介绍一下自动属性:

public Class Customer
{
        private string m_ID;
        //ID属性定义,这种写法大家都很熟悉
        public string ID
        {
                get{ return m_ID; }
                set{ m_ID = value;}
        }
       
}

//C#3.0中大大简化这种属性的写法(确实节省了不少代码量,赞!)
public Class Customer
{
        public string ID{get; set;}
}

C# 3.0的自动属性就不需要创建私有变量,而把这个工作交给编译器代劳!当然,如果需要在获取访问器get或设置访问器set里头添加一些逻辑,扩展也很方便。

2.对象初始化器

//我们还是以以前习惯的写法举例
public Class Customer
{
      public Customer()
      {
      }

      public Customer(string pID)
      {
         ID = pID;
      }

      public Customer(string pID,string pName,string pAge)
      {
         ID = pID;
         Name = pName;
         Age = pAge;
      }

      public string ID{ get; set;}
      public string Name{get;set;}        
      public string age{get;set;}
}

        //Customer对象初始化
        Customer customer = new Customer();
        customer.ID = "001";
        customer.Name = "Test001";
        customer.Age = "28";
        
        //或者使用构造函数
        Customer customer = new Customer("001","test001","28");

 

上面这种写法在我们以前的代码里随处可见,而有了对象初始化器之后这种写发会被更简洁的代码所替代,不需要写这么多条的赋值语句,不需要定义这么多的构造函数来初始化;

//对象初始化器
public Class Customer
{
      public Customer()
      {
      }

      public string ID{ get; set;}
      public string Name{get;set;}        
      public string age{get;set;}
}

        //Customer对象初始化(想要初始化几个属性都可以)
        Customer customer = new Customer{ ID="001",Name="test001",age="28"};

当然从本质上讲,只是简化了代码编写工作,后台编译器自动完成转换。对象初始化器实际上利用了编译器对对象中对外可见的字段和属性进行按序赋值,在编译时还是隐式调用了构造函数,对字段或属性的进行逐一赋值。

 

除了在初始化类时设置简单的属性值外,对象初始化器特性也允许我们设置更复杂的嵌套(nested)属性类型

//Customer对象初始化(想要初始化几个属性都可以)
Customer customer = new Customer{ ID="001",Name="test001",age="28",
        Detail=new CustomerDetail{Address="sh",DeliAddress="fj"}};

3.集合初始化器

集合初始化器会对初始化器中的元素进行按序调用ICollection<T>.Add(T) 。应用集合初始化器的对象的类型必须实现了System.Collections.Generic.ICollections<T>接口并指定了确定的T。

例如:
List<
int> num= new List<int0126789 };

List<Customer> customers = new List<Customer>{ 
        new Customer{ID="001",Name="test001",age="28"},
        new Customer{ID="002",Name="test002",age="29"},
        new Customer{ID="003",Name="test003",age="30"} };

这和以前调用List.Add没有本质的区别,编译器自动的调用了List的无参构造方法,然后实例化一个个的Customer,再一个个的Add进去,和我们原来的做法没有什么不同,但是,这是编译器在后台自动处理,简省了我们很多的编码工作。

 

小结:从这些新特性可以看出微软在底层编译器中集成越来越多的工作,使得开发人员宝贵的时间尽可能的节省,代码的编写更符合人的思维模式;工具的强大使得开发人员工作精力更集中在业务实现这块,而无需关注更多的底层细节;确实语言平台都是工具,开发出合格的产品才是我们更应该关注的!


网友博客中拷贝的一段话:(原文http://www.cnblogs.com/yuyijq/archive/2008/07/17/1244433.html

附加:
刚开始想想这对象集合初始化器也许就一鸡肋,没啥用,不就减少一点点代码么,像这种简单的初始化工作,大部分代码生成器都可以来干。后来在研究匿名类型的时候突然发现,如果没有这个对象初始化器,匿名类型是不是要复杂一些?或者就是难以实现?
var test = new{Key="test",Value="test"};如果没有对象初始化器,匿名类型该怎么办?

匿名类型还没正式研究,但是我觉的任何一个改变都不会是孤立存在,C#3.0的许多新特性也是互相关联,而且可以肯定很多新特性是为了Linq这个做准备的!(随着研究深入会不断补充新体会)

posted @ 2009-05-27 17:47  ShelleyZhang  阅读(151)  评论(0编辑  收藏  举报