Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器(转自:清清月儿)

来源:互联网 发布:c语言函数的调用 编辑:程序博客网 时间:2024/05/01 12:59

新的C#语言特性:自动属性(Automatic Properties)

如果你现在是C#开发人员的话,你大概非常习惯编写象下面这个代码片段一样带有基本属性的类型:

    public class Person {

        private string _firstName;
        private string _lastName;
        private int _age;
       
        public string FirstName {

            get {
                return _firstName;
            }
            set {
                _firstName = value;
            }
        }

        public string LastName {

            get {
                return _lastName;
            }
            set {
                _lastName = value;
            }
        }       
       
        public int Age {

            get {
                return _age;
            }
            set {
                _age = value;
            }
        }
    }
注意,我们在属性的geter/setter中实际上并没有添加什么逻辑,我们只是将get/set实施到了一个成员变量。我们不禁要问这样一个问题:为什么不直接使用成员变量而使用属性呢?这是因为,向外面呈现公开的成员变量有很多不好的地方。二个最大的问题是:1) 你无法轻易地对成员变量做数据绑定,2) 如果你从类中向外呈现成员变量的话,之后,你不重新编译那些引用老的类的任何程序集,就无法将它们改成属性(譬如,要添加验证逻辑到setter里)。

Orcas中发布的新C#编译器通过一个叫“自动属性(automatic properties)”的语言特性提供了一个优雅的方式来使得你的编码更加简洁,同时还保持属性的灵活性。自动属性允许你避免手工声明一个私有成员变量以及编写get/set逻辑,取而代之的是,编译器会自动为你生成一个私有变量和默认的get/set 操作。

譬如,使用自动属性,我现在可以将上面的代码改写成:

    public class Person {
   
        public string FirstName {
            get; set;
        }

        public string LastName {
            get; set;
        }       
       
        public int Age {
            get; set;
        }
    }
或者,我想更简明的话,我可以将空白的地方做进一步压缩,象这样:

    public class Person {
        public string FirstName { get; set; }
        public string LastName  { get; set; }       
        public int    Age       { get; set; }
    }
当Orcas版中的C#编译器遇上象上面这样的空的get/set属性的话,它会自动为你在类中生成一个私有成员变量,对这个变量实现一个公开的getter 和setter。这么做的好处是,从类-合同(type-contract)的角度来看,这个类跟我们上面第一个有点冗长的实现看上去完全一样,这意味着,不象公开的成员变量,在将来,我可以在我的属性setter实现中添加验证逻辑,而不用对引用我的类的任何外部组件做改动。

Bart De Smet对使用Orcas三月份CTP版中的自动属性时内部发生的情形作了精彩的描述,你可以在这里阅读他的精彩相关帖子。

C#和VB语言的新特性:对象初始化器(Object Initializers)

.NET框架中的类型非常依赖于属性的使用。当生成对象实例和使用新的类型时,写出象下面这样的编码是非常常见的情形:

   Person person = new Person();
   person.FirstName = "Scott";
   person.LastName = "Guthrie";
   person.Age = 32;
你有没有想要把这样的编码简化过(也许将其安排在一行上)?使用Orcas中的C#和VB语言编译器的话,你现在可以利用一个称为“对象初始化器(object Initializers)”的“语法甜头(syntactic sugar)”语言特性来做些简化,将上述代码重写为:

  Person person = new Person { FirstName="Scott", LastName="Guthrie", Age=32 };
然后,编译器就会自动地生成合适的属性setter代码,保持跟前面较冗长的代码例子同样的语意。

除了在初始化类时设置简单的属性值外,对象初始化器特性也允许我们设置更复杂的嵌套(nested)属性类型。譬如,假如我们在上面定义的每个Person类型也拥有一个属于Address类型的叫“Address”的属性。我们可以编写下面这样的代码来生成一个新的Person对象,同时设置它的属性,象这样:

   Person person = new Person {
      FirstName = "Scott",
      LastName = "Guthrie"
      Age = 32,
      Address = new Address {
         Street = "One Microsoft Way",
         City = "Redmond",
         State = "WA",
         Zip = 98052
      }
   };
Bart De Smet对使用Orcas三月份CTP版中的对象初始化器时内部发生的情形也作了精彩的描述,你可以在这里阅读他的精彩相关帖子。

C#和VB语言的新特性:集合初始化器(Collection Initializers)

对象初始化器很棒,它极大地简化了把对象添加到集合的做法。譬如,假如我要把三个人加到一个基于泛型的类型为Person的List集合中去的话,我可以写下面这样的编码:

  List<Person> people = new List<Person>();
           
  people.Add( new Person { FirstName = "Scott", LastName = "Guthrie", Age = 32 } );
  people.Add( new Person { FirstName = "Bill", LastName = "Gates", Age = 50 } );
  people.Add( new Person { FirstName = "Susanne", LastName = "Guthrie", Age = 32 } );
 
对这个例子,跟我使用C# 2.0编译器要输入的代码相比,单独使用新的对象初始化器特性就能省去12行额外的代码。

但Orcas版中的C#和VB编译器允许我们更进一步,现在同时支持“集合初始化器(collection initializers)”,这允许我们避免要写多个Add语句,省下更多的键盘操作:

   List<Person> people = new List<Person> {
      new Person { FirstName = "Scott", LastName = "Guthrie", Age = 32 },
      new Person { FirstName = "Bill", LastName = "Gates", Age = 50 },
      new Person { FirstName = "Susanne", LastName = "Guthrie", Age = 32 }
   };
当编译器遇上上面这样的句法时,它会自动为我们生成象前面的例子一样的集合插入编码。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/21aspnet/archive/2007/03/20/1535459.aspx