注意:本文是在产品发行前编写的,因此无法保证内文细节与实际产品完全相符。本文的信息仅代表文件出版时产品的情况,只可作为计划时参考。文件中信息如有变更恕不另行通知。
简介 Microsoft Visual Studio 的下一版 (代号为 Whidbey) 明显增强了 C# 的功能,包括创新的语言结构、新编译器功能、大幅提升了开发人员的生产力、加强调试功能等等。在程序语言创新功能方面,C# Whidbey 发行版本支持泛型(Generics)、iterator (迭代器)、部份类型,以及匿名方法。 Whidbey 的新编译器功能可让开发人员直接在代码中禁用编译器警告,或验证 ECMA/ISO 一致性。 Whidbey 也将具有数种生产力增强功能,包括重构 (refactoring)、 代码展开、代码格式化、增强 IntelliSense 等许多功能。调试功能也有加强,新功能包括增强的 datatips (信息快显)、调试的可视化工具、设计时的表达时式评估等等。 本文仅概括地介绍 Whidbey 中的新功能,我们将继续加入客户所需的新功能。
语言创新功能 泛型
泛型是 Whidbey 中 C# 语言最主要的新功能之一。 C# 的泛型可允许类、结构、接口与方法,依其存储与处理的数据类型加以参数化。 泛型所以好用,因为许多常见类别与结构,可依其存储与处理的数据类型加以参数化。这些称为“泛型类声明”和“泛型结构声明”。同样地,许多 接口定义合约,可依其处理的数据类型加以参数化。这些称为“泛型接口声明”。方法也可依其类型加以参数化,以便实现“泛型算法”,这些称之为“泛型方法”。
在下面的例子中,我们创建了一个 Stack 泛型类声明,其中指定了类型参数,叫做 ItemType,在声明之后的尖括弧中予以声明。 泛型 Stack 类实例不会强迫在对象之间来回转换,而是接受创建时的类型,并不加转换地存储该类型的数据。 ItemType 类型参数的作用有如占位符,直到使用时才指定实际 类型。请注意,ItemType 用于内部项目数组的元素类型、Push 方法的参数类型,以及 Pop 方法的返回类型:
public class Stack { private ItemType[ ] items; public void Push(ItemType data) {...} public ItemType Pop() {...} } |
如下列简短例子所示,使用 Stack 泛型类声明时,可指定泛型类所用的实际类型。 在此种情况下,我们通过在名称后的尖括号内 指定“类型形参”来要求 Stack 使用 int 类型:
Stack<int> stack = new Stack<int>(); stack.Push(3); int x = stack.Pop(); |
这样,我们便创建了一个新的“构造类型”Stack<int>,其中 Stack 声明内部的每个 ItemType 将被取代为提供的 int 类型形参。事实上,建立 Stack<int> 的新实例时,为了存储效率的考虑,项目数组的原本存储类型现在为 int[],而非 object[]。此外,当将 int 推压到堆栈时,不再需要对它进行转换。甚至,从堆栈取出项目时,不再需要明确地将它转换为适当的类型,因为 Stack 这个特别的类在其数据结构中,将 int 以其原本的类型存储。
若要存储非 int 项目至 Stack,必须由 Stack 建立不同的构造类型,并指定新类型形参。假如有一个简单的 Customer 类,且我们希望使用 Stack 来存储。要达到这个目的,只需使用 Customer 类作为 Stack 的类型形参,就可轻松地重复使用代码:
Stack<Customer> stack = new Stack<Customer>(); stack.Push(new Customer()); Customer c = stack.Pop(); |
当然,一旦建立了以 Customer 为类型形参的 Stack,则仅可以存储 Customer 对象 (或派生自 Customer 类的对象)。 泛型提供“强类型检验”(strong typing),亦即我们无法再以下列不当方式将整数存储 在 stack 中:
Stack<Customer> stack = new Stack<Customer>(); stack.Push(new Customer()); stack.Push(3); // compile-time error Customer c = stack.Pop(); // no cast required |
部分类型
部份类型允许单一类型,如一个类,分散至多个文件中。此功能对 Visual Studio 等代码生成器最为有用,它能将生成的代码与使用用者编写的代码分开存储在不同的文件中。藉由此方式,设计工具可以轻易地剖析与重新产生 代码,而不会影响到用户所编写的代码。例如:
// Form1Designer.cs public partial class Form1: System.Windows.Forms.Form { // 设计器代码 void InitializeComponent() { ... } }
// Form1User.cs public partial class Form1 { // 用户代码 void Mouse_Click(object sender, MouseEventArgs e) { ... } } |