1.3 C# 2.0新特性概览
自2000年末最初发布以来,C#取得了长足的发展,其发展历程因得到广泛的采用而进一步加速。随着Visual Studio 2005和.NET Framework 2.0的发布,C#编译器开始支持C# 2.0的增强功能。这是一个好消息,因为C# 2.0包括了很多方便的特性,这些特性带来更舒适的编程(www.cppentry.com)体验,也提高了效率。本节简要叙述这些新特性,并指出本书的哪些章节包括这方面的详细信息。
毫无疑问,C# 2.0最好的扩展特性是对泛型(generic)的支持。它的语法类似C++(www.cppentry.com)的模板,但二者之间的主要区别在于从.NET泛型创建的构造类型(constructed type)本质上是动态的,也就是说,它们是在运行时被绑定和构造的。这与C++(www.cppentry.com)从模板创造具体类型有区别,C++(www.cppentry.com)的这个过程是静态的,从某种程度上说是编译时绑定和构造的 。当与向量、列表、散列表等集合类型结合使用时,泛型是最有用的,它们带来的成果是最高效的。泛型可以依具体类型而不是使用所有对象的基类型System.object来处理其所包含的类型。第11章讲解泛型,第9章将讲解集合(collection)。
C# 2.0支持匿名方法。匿名方法有时也被称为lambda函数,这是函数式编程(www.cppentry.com)的术语。C#的匿名方法对委托和事件特别有用。委托和事件是用来注册回调函数的结构,这些回调方法在委托或事件触发的时候被调用。通常,可以用一个在其他地方定义好的方法。但有了匿名方法,你可以在委托或事件被构造的时候内联地定义它们的代码。这在委托只需要做有限的工作的时候特别方便,因为这种情况下定义一个完整的方法就有点小题大做了。更好的是,匿名方法体里面可以访问它的定义点所在范围内的所有变量 。匿名方法将在第10章讨论。C# 3.0新引入的lambda表达式取代了匿名方法,使代码的可读性更好。
C# 2.0支持迭代器。任何熟悉C++(www.cppentry.com)标准模板库(Standard Template Library,STL)的人都知道迭代器和它的用处。在C#里,通常可以用foreach语句来迭代一个有集合行为的对象。这个集合对象必须实现IEnumerable接口,IEnumerable包含GetEnumerator方法。在容器类型中实现GetEnumerator方法非常繁琐乏味。但是用C#迭代器,实现GetEnumerator方法就是小菜一碟。第9章将详细介绍迭代器。
最后,C# 2.0增加了对分部类型(partial type)的支持。在C# 2.0之前,必须把整个类定义在一个文件(也称为一个编译单元)里面。这个要求随着分部类型的出现而放松了。这对那些需要代码生成器来产生骨架代码的人来说是个好消息。例如,可以用Visual Studio向导生成System.Data.DataSet继承类型来访问数据库里的数据。C# 2.0之前,修改生成的代码是个问题,你必须用一个新类型继承或包含生成的类型来特化它的实现,或者必须要修改生成的代码。修改生成的代码有很大的风险,因为当出于某种原因向导重新生成代码时,所做的修改会丢掉。分部类型解决了这个问题,因为现在可以在一个单独的文件中来增强生成的代码了,这样你的修改在向导重新生成代码的时候就不会丢失。关于如何使用分部类型,你可在用Visual Studio创建Windows Forms程序时查看自动生成的代码。可以在第4章找到有关分部类型更详细的信息。