抽空看完了Scott Guthrie在他Blog上今年3,4月份发表的几篇关于“Orcas语言新特性”(New Orcas Language Features)的文章,至此,对于C#3.0的语言新特性也已经有了一个Overview上的认识。当然我也只是一个相当入门的级别而已。然而,这里作一个归纳,对Orcas感兴趣的帅哥靓妹可以从这里Get Started。
- 自动属性:过去定义一个属性,我们需要先定义一个field,然后在属性中添加Set/Get Accessor。现在我们只要按照如下方式Coding: public string Size { get; set; } 编译器就会为我们产生定义Size属性所需要的一切。
- 对象和集合初始化器:这两个本为一家,目的就是为了在实例化对象后,节省代码的输入量。(有点像JSON的感觉)如下:
Person person = new Person();
person.FirstName = "Scott";
person.LastName = "Guthrie";
person.Age = 32; // 太长太复杂,以下一行就可以搞定
person.FirstName = "Scott";
person.LastName = "Guthrie";
person.Age = 32; // 太长太复杂,以下一行就可以搞定
Person person = new Person { FirstName="Scott", LastName="Guthrie", Age=32 };
扩展方法使得我们可以为CLR中的某个Type添加方法,而不用重新去编译这个Type的Assembly。它的出现是为了给LINQ打基础。要知道LINQ中查询语法,其实编译器最终都是为我们产生了对这些Extension Methods的调用。他们都被包含在System.Linq命名空间中。
设计它的目的有两个:
- 匿名方法:Lambda表达式就是一个Delegate的实例,这个在早先说过。
- 表达式树(Expression Tree):这个是Linq to Sql实现高效数据查询的关键。这使得Linq to Sql引擎会去根据这个Tree获得的信息来创建合适的Sql表达式,然后发送到Database端去执行。这样所有的操作都是在数据库端完成的,而不用下载在本地内存中后再去执行。
4. Query Syntax
这个其实是对以上这些知识的综合运用了,Linq特色的语法。其实以上这些语言特性都是被了Linq的实现作准备的,但是他们各自又都可以被独立使用。
某些类型可能只是在某个语句块中才会被使用到。我们没有必要去自定义一个这样的类。这就和匿名方法产生的原因雷同。同时,匿名类型也引出了Var关键字的使用,这使得让编译器来为我们推荐数据类型。然而由于匿名类型的Type Name是未知的,所以我们只能用Var来引用。
var product = new {
Id = 1232;
Name = "Piano";
UnitPrice = 100.00;
TotalRevenue = 100000.00};
Id = 1232;
Name = "Piano";
UnitPrice = 100.00;
TotalRevenue = 100000.00};