Visual C# 2005抢先预览
注意:本文是在产品发行前编写的,因此无法保证内文细节与实际产品完全相符。本文的信息仅代表文件出版时产品的情况,只可作为计划时参考。文件中信息如有变更恕不另行通知。简介
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) { ... } } |
匿名方法
匿名方法可视为将代码块作为参数来传递的功能。一般而言,匿名方法可以在期望使用委托的任何地方被替换。以下为最简单的例 子:
button1.Click += delegate { MessageBox.Show("Click"); }; |
在此需要注意一些事项。首先,以内联方式编写方法是合法的。其次,返回类型或方法参数都没有描述。第三,delegate 关键字被用来位移此结构。在此并未列出返回类型,因为编译器会自行“推断”。 亦即编译器已知预期的项目(EventHandler),因此将检查所定义的匿名方法是否可被转换成该方法。
在先前的例子中,您可能会发现并未列出参数。 这是因为代码块中并不需要这些参数。若要使用这些参数,声明将如下所示:
button1.Click += delegate(object sender, EventArgs e) { MessageBox.Show(sender.ToString()); }; |
请注意,必须指定类型与参数名称。
Iterator
Iterator 类似于 C# 中的 foreach 语句,可简化集合里的重复 (iterate) 过程。目前,使用 foreach 关键字可轻易地在集合内进行重复。不过,编写使用 foreach 的集合,必须实现 IEnumerable 与 IEnumerator 接口,并且分别建立 Enumerator 类/结构。Iterator 可减轻这类例行代码的工作负担,并可让框架开发人员轻易地公开可列举的集合。例如:
class List: IEnumerable { private T[] elements; public IEnumerator GetEnumerator() { foreach (T element in elements) { yield element; } } } |
上面代码使用了一个新的关键字 yield。yield 仅可用于返回 IEnumerator、IEnumerable 或其它泛指对等类型的方法。Iterator 也可以参数的形式来命名与传递,不过,在大部份 情况下,命名的 iterator 将返回 IEnumerable,而非 IEnumerator。例如:
class List { private T[ ] elements; public IEnumerable Range(int from, int to) { while (from < to) yield elements[from++]; } } |
别名限定词 (全局命名空间限定词)
代码产生器目前所面临的问题之一是如何确保不要干扰用户所编写的代码,或 Visual Studio 等代码产生工具所建立的代码。一般建议代码产生器尽可能严格使用合格的类型。若要在 C# 中严格使用合格的类型将面临一个问题,也就是无法在根命名空间搜寻类型。为了解决此问题, 全局命名空间限定词引入了“::”运算符,作为命名空间或类型名称前置词。如此,开发人员能在代码中以明确的方式 引用根命名空间,如下所示。
namespace Acme { namespace System { class Example { static void Main() { // In Visual Studio 2003, looking up // System.Console.WriteLine would have // started in the Acme.System namespace. ::System.Console.WriteLine("Hello"); } } } } |
静态类
静态类具有仅含静态方法的私有构造函数,可用来取代建立密封类(sealed class)的设计模式。将静态修饰词(static)置于类声明中,便可 表示静态类。例如:
public sealed class Environment { // Keep class from being created private Environment() { } } |
现在可用下列方式编写:
补充:软件开发 , C# ,