Scott Guthrie 博客中文版

Scott Guthrie's Blog on ASP.NET and .NET (英文原版地址:http://weblogs.asp.net/scottgu)

   博客堂 :: 首页 :: 联系 :: RSS 2.0 ::
随笔 - 272, 评论 - 1623, 引用 - 436

导航

标签

每月存档

最新留言

广告

 

【原文地址】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

标签: , ,

打印 | 张贴于 2007-03-11 09:52:00 | Tag:ASP.NET  .NET  LINQ

留言反馈

#[转贴].NET3.5新特性,Lambda表达式 编辑
【原文地址】New
2008-02-13 21:01:00 | [匿名:菩提树下的杨过]
#回复: Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器 编辑
真的很好 ,真的很强大
2008-02-05 12:41:00 | [匿名:ddxx]
#Visual Studio 2008 和 .NET 3.5 发布了 编辑
【原文地址】VisualStudio2008and.NET3.5Released 【原文发表日期】Monday,November19,200710:34AM 今天我们发布...
2008-01-25 19:33:00 | [匿名:宏宇]
#新Orcas语言特性:扩展方法 编辑
新Orcas语言特性:扩展方法
2008-01-24 11:04:00 | [匿名:都市剑客]
#ASP.NET MVC框架(第三部分): 把ViewData从控制器传到视图 编辑
【原文地址】 ASP.NET MVC Framework (Part 3): Passing ViewData from Controllers to Views 【原文发表日期】 Thursday,
2008-01-19 02:18:00 | [匿名:ASP.NET Chinese Blogs]
#ASP.NET MVC框架 (第二部分): URL路径选择 编辑
【原文地址】 ASP.NET MVC Framework (Part 2): URL Routing 【原文发表日期】 Monday, December 03, 2007 2:44 AM 上个月,我发表了我要撰写的系列贴子中的
2008-01-19 02:18:00 | [匿名:ASP.NET Chinese Blogs]
#ASP.NET MVC框架 (第二部分): URL路径选择 编辑
ASP.NETMVC框架(第二部分):URL路径选择 【原文地址】ASP.NETMVCFramework(Part2):URLRouting 【原文发表日期】Monday,...
2008-01-14 14:32:00 | [匿名:michaelmin1976]
#ASP.NET MVC框架(第三部分): 把ViewData从控制器传到视图 编辑
【原文地址】ASP.NETMVCFramework(Part3):PassingViewDatafromControllerstoViews 【原文发表日期】Thursday...
2008-01-11 15:36:00 | [匿名:幸福]
#Visual Studio 2008 和 .NET 3.5 发布了 编辑
【原文地址】VisualStudio2008and.NET3.5Released 【原文发表日期】Monday,November19,200710:34AM 今天我们发布...
2008-01-08 16:00:00 | [匿名:吴华朋]
#ASP.NET MVC框架 (第二部分): URL路径选择 编辑
【原文地址】ASP.NETMVCFramework(Part2):URLRouting 【原文发表日期】Monday,December03,20072:44AM 上个月,...
2008-01-05 08:48:00 | [匿名:幸福]
#Visual Studio 2008 和 .NET 3.5 发布了 编辑
【原文地址】VisualStudio2008and.NET3.5Released 【原文发表日期】Monday,November19,200710:34AM 今天我们发布...
2008-01-05 08:43:00 | [匿名:幸福]
# C# 3.0 的自动属性(Automatic Properties) 编辑
使用自动属性后,你可以不用手工声明一个私有成员变量以及编写get/set逻辑,取而代之的是,编译器会自动为你生成一个私有变量和默认的get/set操作。系统为你产生的私有变量在IDE中,你是看不到的...
2007-12-17 12:26:00 | [匿名:csdnexpert]
# C#3.0 中对象初始化器(Object Initializers)和集合初始化器(Collection Initializers) 编辑
C#3.0中对象初始化器(ObjectInitializers)
2007-12-17 12:25:00 | [匿名:csdnexpert]
#回复: Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器 编辑
自动属性,对象初始化器等,这些改进都不大。不足以激动人心。不过那个html编辑器太好了。
2007-12-05 13:20:00 | [匿名:hpv]
#C#3.0介绍 编辑
以下资源仅供大家参考: 1、自动属性,对象初始化器,和集合初始化器 2、新Orcas语言特性:扩展方法 3、新Orcas语言特性:Lambda表达式 4、新Orcas语言特性:查询句法...
2007-11-27 18:19:00 | [匿名:曹振华]
#C#3.0介绍 编辑
以下资源仅供大家参考: 1、自动属性,对象初始化器,和集合初始化器 2、新Orcas语言特性:扩展方法 3、新Orcas语言特性:Lambda表达式 4、新Orcas语言特性:查询句法...
2007-11-27 18:19:00 | [匿名:曹振华]
#Visual Studio 2008 和 .NET 3.5 发布了 编辑
转自:http://blog.joycode.com/scottgu/archive/2007/11/20/111568.aspx
2007-11-27 17:53:00 | [匿名:曹振华]
#Visual Studio 2008 和 .NET 3.5 发布了 编辑
今天我们发布了VisualStudio2008和.NET3.5。你可以使用下面的链接下载其最终版: 如果你是MSDN订阅者,你可以在MSDN订阅网站下载(注:其中...
2007-11-20 16:44:00 | [匿名:大口仔]
#Visual Studio 2008 和 .NET 3.5 发布了 编辑
转自:http://blog.joycode.com/scottgu/archive/2007/11/20/111568.aspx
2007-11-20 15:19:00 | [匿名:Randy0528]
#技巧/诀窍:用 .NET 3.5 创建 ToJSON() 扩展方法 (木野狐译) 编辑
【原文地址】 Tip/Trick: Building a ToJSON() Extension Method using .NET 3.5 【原文发表日期】 Monday, October 01, 2007
2007-10-10 10:53:00 | [匿名:Joycode@Ab110.com]
#VS 2008 和 .NET 3.5 Beta 2 发布了(转帖) 编辑
VS 2008 和 .NET 3.5 Beta 2 发布了(转帖)
2007-09-06 22:38:00 | [匿名:IMustDo]
#新Orcas语言特性:查询句法 编辑
新Orcas语言特性:查询句法
2007-08-22 10:08:00 | [匿名:BoardPung]
#VS 2008 和 .NET 3.5 Beta 2 发布了 编辑
VS2008和.NET3.5Beta2发布了 【原文地址】VS2008and.NET3.5Beta2Released【原文发表日期】Thursday,July...
2007-08-17 13:52:00 | [匿名:ejiyuan]
#VS 2008 和 .NET 3.5 Beta 2 发布了 编辑
【原文地址】 VS 2008 and .NET 3.5 Beta 2 Released 【原文发表日期】 Thursday, July 26, 2007 2:11 PM 我非常高兴地宣布,VS 2008和
2007-07-30 12:17:00 | [匿名:Joycode@Ab110.com]
#C#3.0 中对象初始化器(Object Initializers)和集合初始化器(Collection Initializers) 。 编辑
C# 3.0 中对象初始化器(Object Initializers) 和 集合初始化器(Collection Initializers) ,就是简化我们的代码,让本来几行才能写完的代码一行写完。这样在LINQ的使用中,我们才不会把一个LINQ表达式写的巨复杂无比。
2007-07-06 18:02:00 | [匿名:勤勤同学]
#C#3.0 中对象初始化器(Object Initializers)和集合初始化器(Collection Initializers) 编辑
C# 3.0 中对象初始化器(Object Initializers) 和 集合初始化器(Collection Initializers) ,就是简化我们的代码,让本来几行才能写完的代码一行写完。这样在LINQ的使用中
2007-06-06 17:34:00 | [匿名:Joycode@Ab110.com]
#C#3.0 中对象初始化器(Object Initializers)和集合初始化器(Collection Initializers) 编辑
C# 3.0 中对象初始化器(Object Initializers)
2007-06-06 16:35:00 | [匿名:ghj1976]
#C# 3.0 的自动属性(Automatic Properties) 编辑
使用自动属性后,你可以不用手工声明一个私有成员变量以及编写get/set逻辑,取而代之的是,编译器会自动为你生成一个私有变量和默认的get/set 操作。系统为你产生的私有变量在IDE中,你是看不到的
2007-06-06 11:36:00 | [匿名:ASP.NET Chinese Blogs]
#C# 3.0 的自动属性(Automatic Properties) 编辑
使用自动属性后,你可以不用手工声明一个私有成员变量以及编写get/set逻辑,取而代之的是,编译器会自动为你生成一个私有变量和默认的get/set 操作。系统为你产生的私有变量在IDE中,你是看不到的,如下图: 当然如果你希望属性中有些赋值或者取值逻辑校验,自动属性可是不适合你的。
2007-06-05 14:32:00 | [匿名:ghj1976]
#C# 3.0 的自动属性(Automatic Properties) 编辑
使用自动属性后,你可以不用手工声明一个私有成员变量以及编写get/set逻辑,取而代之的是,编译器会自动为你生成一个私有变量和默认的get/set 操作。系统为你产生的私有变量在IDE中,你是看不到的
2007-06-05 14:31:00 | [匿名:Joycode@Ab110.com]
#新Orcas语言特性:匿名类型 编辑
匿名类型是C#和VB的方便语言特性,它允许开发人员在代码内简明地定义行内CLR类型,而不用显式地对类型定义一个正式的类声明。这个LINQ的强有力的特性允许你对一个数据源(不管这个数据源是数据库,XML文件还是内存中的集合)做查询操作,然后对查询数据的结果构形成与原先数据源不同的结构或格式。但有的时候,我只想要在我当前的代码范围内查询和操作数据,我不想要另外正式地定义一个类来代表我的数据,才可以操作数据。在这种情形下,匿名类型非常有用,因为它们允许你在你的代码内,简明地定义一个新类型在行内使用。
2007-05-21 13:36:00 | [匿名:shoutor]
#LINQ篇:查询句法[转] 编辑
2007-04-25 20:47:00 | [匿名:MonkRui]
#[不搜集不行]新Orcas语言特性:查询句法 编辑
fromhttp://weblogs.asp.net/scottgufromhttp://blog.joycode.com/scottgu/archive/2007/04/24/101654.as...
2007-04-24 22:43:00 | [匿名:ColdDog]
#新Orcas语言特性:扩展方法 编辑
什么是扩展方法 (Extension Methods)?扩展方法允许开发人员往一个现有的CLR类型的公开契约(contract)中添加新的方法,而不用生成子类或者重新编译原来的类型。扩展方法有助于把今天动态语言中流行的对duck typing的支持之灵活性,与强类型语言之性能和编译时验证融合起来。
2007-04-10 13:35:00 | [匿名:shoutor]
#回复: Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器 编辑
很好,研究下
2007-03-26 12:16:00 | [匿名:firefox]
#2007年将是一个asp.net 开发重要的一年 编辑
微软开发部门总经理、asp.net之父Scott Guthrie最近的blog文章和MVP 2007 Gloabl Summit上所作的演讲表明:2007年将是一个asp.net 开发重要的一年。 Orcas代号不但代表了微软的Visual
2007-03-25 22:33:00 | [匿名:毛遂自荐博客集]
#2007年将是一个asp.net 开发重要的一年 编辑
2007-03-25 22:18:00 | [匿名:自由、创新、研究、探索……]
#Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器 编辑
上个星期,我们发布了我们的Visual Studio和.NET框架Orcas版三月份的CTP,这是个谁都可以下的免费下载,同时提供VPC镜像(允许你在一个虚拟机里运行它)以及单独的安装文件(注:如果你在运行Vista的话,你要确认你只使用VPC版本)。你可以在这里下载。
2007-03-19 12:31:00 | [匿名:shoutor]
#回复: Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器 编辑
感觉这样并不好,自动属性来说,没有公私之分了,那在编写代码逻辑时,肯定要出问题的.

对象初始化器嘛,没什么好不好,好象跟c++中的头文件默认值定义类似哦.

集合初始化器就参照上面两点了.
2007-03-16 13:09:00 | [匿名:roydu]
#在 .NET 2.0 中享受 .NET 3.0的特性 编辑
众多的新闻不断的向我轰炸,.NET 3.0是如何如何的好,但本人一直做商业产品的开发,看看可以,叫我在开发的产品中使用这些beta的东西,我是万万不敢的,出了问题老板非要宰了我不可。
2007-03-15 10:03:00 | [匿名:编写人生]
#回复: Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器 编辑
谢谢Xue-Feng Zhang
还是不玩了?分块包不支持下载工具下载麻烦
2007-03-13 17:01:00 | [匿名:test]
#回复: Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器 编辑
To test:
根据下载页面的说明,不能使用 Base01.vmc,必须使用 VSMar2007CTP_VSTSTFS.vmc(解开那 9 个 WinRAR 压缩包)...
2007-03-13 09:04:00 | [匿名:Xue-Feng Zhang]
#回复: Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器 编辑
Username: Administrator
Password: P2ssw0rd
VPC版用上面的密码登录不了,何解?????????
2007-03-13 06:25:00 | [匿名:test]
#回复: Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器 编辑
语法看起来确实不错,但仅此而已,更多的感觉是在耍酷。
2007-03-12 23:55:00 | [匿名:tsyung]
#回复: Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器 编辑
很好,谢谢,用用看,/
是不是在 vista下只能下载vpc来安装吗楼主能不能指条明路难道还要装虚拟机??
2007-03-12 22:26:00 | [匿名:cgdou]
#回复: Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器 编辑
很好,谢谢,用用看
2007-03-12 22:15:00 | [匿名:cgdou]
#回复: Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器 编辑
感觉Orcas加了很多的语法糖,确实使开发简化了,但是有的时候让程序的可读性降低了。比如类型推断和匿名类,可能几年以后的程序员都已经不知道什么是整形、浮点、字符串,因为都是自动推断的了,拿来用就行了。
2007-03-12 10:41:00 | [匿名:妖居]
#回复: Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器 编辑
貌似語法甜頭
沒有什么很大的改變
2007-03-12 07:51:00 | [匿名:tsoukw]
#回复: Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器 编辑
沒有什么很大的改變
2007-03-12 07:50:00 | [匿名:tsoukw]
#回复: Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器 编辑
这种简化,并没有损害程序的可读性,我喜欢这种简化
2007-03-11 20:05:00 | [匿名:javanb]
#回复: Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器 编辑
How cool Orcas is
2007-03-11 18:29:00 | [匿名:goodspeed]
#回复: Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器 编辑
这些改变相当于一种方言,意义不大.
2007-03-11 12:58:00 | [匿名:ss]
#回复: Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器 编辑
看起来不错的样子

但是,就我个人而言,不太喜欢这种在语言上的简化
2007-03-11 11:07:00 | [匿名:scdsun]
对不起,目前本随笔不允许发表新评论.