`

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

阅读更多

【原文地址】New C# "Orcas" Language Features: Automatic Properties, Object Initializers, and Collection Initializers
【原文发表日期】 Thursday, March 08, 2007 11:01 PM

上个星期,我们发布了我们的Visual Studio和.NET框架Orcas版三月份的CTP,这是个谁都可以下的免费下载,同时提供VPC镜像(允许你在一个虚拟机里运行它)以及单独的安装文件(注:如果你在运行Vista的话,你要确认你只使用VPC版本)。你可以在这里下载。

几个星期前,我曾在博客上讨论过Orcas中针对ASP.NET开发人员的一些重大的改进。如果你还没有读过这个贴子的话,我强烈建议你在这里读一下。我认为你会非常喜欢该帖子讨论的新特性的。

除了那些框架和工具类的精彩新特性外,我认为开发人员(包括所有的.NET应用类型的开发人员)会非常喜爱Orcas的一件事情是,VB和C#将包含一些新语言特性和改进。这些语言改动将以既微妙又深刻的方式改进我们的开发体验,势将改进效率,减小我们需要键入的代码量。

在下几个星期里,我将试着在博客里讨论几个这些语言的改进之处,示范如何把它们使用在一起,来产生一些非常强有力的结果。

新的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 }
   };

 

当编译器遇上上面这样的句法时,它会自动为我们生成象前面的例子一样的集合插入编码。

结语

作为开发人员,我们现在拥有了简明得多的方式来定义对象,对它们初始化,将它们加入集合内。在运行时,其语意,跟今天的较长的版本的语意,是完全一样的(所以你不必担心行为会改变)。但现在你不需输入那么多字符了,你的代码将既干净又简明。

在不远的将来,我将发表更多的博客贴子来讨论Orcas版中更多的语言上的改进,包括扩展方法(Extension Methods),Lambdas和匿名类。然后,我将对LINQ做深入讨论,示范它是如何利用所有这些特性来提供一个非常优雅的方式来查询和与数据交互的。

希望本文对你有所帮助,

Scott

标签: ASP.NET, .NET, LINQ
 
分享到:
评论

相关推荐

    新Orcas语言特性-查询句法

    自动属性,对象初始化器,和集合初始化器 扩展方法 Lambda表达式 今天的贴子要讨论另一个基础性的新语言特性:查询句法(Query Syntax)。 什么是查询句法(Query Syntax)? 查询句法是使用标准的LINQ查询运算符来表达...

    C#3.0语言新特性(语言规范)

    C#3.0(C#Orcas——魔鬼)在C#2.0的基础上引入了很多语言扩展,用以支持高级别的函数式风格类库的创建和使用。这些扩展使得结构性API构造具有与其他领域(如关系数据库和XML)中查询语言同等的表达能力。这些扩展...

    orcas(VS2008)新概念教程

    最新的VS2008教程

    Orcas

    Orcas

    orcas安装界面

    orcas安装界面

    调试技巧vs2008实用

    VS2008引入了250多个新特性,整合了对象、关系型数据、XML的访问方式,语言更加简洁。使用Visual Studio 2008可以高效开发Windows应用。设计器中可以实时反映变更,XAML中智能感知功能可以提高开发效率。同时Visual ...

    orcas_island:一个通过阅读短篇小说来练习英语发音的网站

    使用快递生成器: 510 patriciasaylor:orcas_island$ express 。 目的地不为空,继续? [是/否] 是 创造 : 。 创建:./package.json 创建:./app.js 创建:./public 创建:./public/javascripts 创建:./public/im

    C#3.0说明书

    C# 3.0 (“C# Orcas”) introduces several language extensions that build on C# 2.0 to support the creation and use of higher order, functional style class libraries. The extensions enable construction ...

    orcas

    逆戟鲸 一个简单的操作系统,当前支持线程库,文件系统,内存管理和设备驱动。当前版本为v-0.1。 一个小型操作系统,现在支持线程库,文件系统,内存管理和设备驱动程序。 当前版本是v-0.1。

    LINQ的演变及其对C#设计的影响

    本页内容Lambda表达式扩展方法匿名类型隐式类型化部变量对象初始值查询表达式我曾是Connections系列节目的一名超级爱好者,这是在《探索频道》(DiscoveryChannel)中由JamesBurke主持的节目。其基本假定是:看起来...

    Visual Studio 2008 自动卸载工具

    自动卸载工具 注意:此工具不会卸载 ...删除“Microsoft Visual Studio 代号 Orcas 远程调试器” 删除“Microsoft Visual Studio 64 位先决条件测试版”(仅限 64 位平台) 删除“Microsoft .NET Framework 3.5”

    BoundListView - Orcas Beta 2

    WPF ListView 数据绑定

    ASP.NET 2.0入门与提高系列课程(1):揭开Orcas神秘的面纱

    内含知道文档,学习视频,ppt,示例(原代码),非常好!!!!!!

    .Net FrameWork3.5 WEB 开发新特性

    徐栋主讲,包括.NET Framework 3.5的各种WEB开发方面的新特性。

    An Overview of Visual Studio code name Orcas White Paper

    This is a preliminary document and may be changed substantially prior to final commercial release of the software described herein. The information contained in this document represents the current...

    Visual Studio 2008卸载工具.zip

    自动卸载工具 注意:此工具不会卸载 ...删除“Microsoft Visual Studio 代号 Orcas 远程调试器” 删除“Microsoft Visual Studio 64 位先决条件测试版”(仅限 64 位平台) 删除“Microsoft .NET Framework 3.5”

    WPF与Flash相互调用-嵌入

    最近一个 Partner 希望将以前的 Flash 嵌入到一个全新的 WPF 应用中,将 WPF 在 .NET 3.0 下丰富的用户体验和 Flash 动画相结合,更好地服务于其用户。 嵌入 Flash 相当于嵌入一个 ActiveX 控件,在嵌入过程中也有...

Global site tag (gtag.js) - Google Analytics