Visual C# 2005抢先预览

发表于:2007-05-25来源:作者:点击数: 标签:抢先本文预览visual2005
注意:本文是在产品发行前编写的,因此无法保证内文细节与实际产品完全相符。本文的信息仅代表文件出版时产品的情况,只可作为计划时参考。文件中信息如有变更恕不另行通知。 简介 Microsoft Visual Studio 的下一版 (代号为 Whidbey) 明显增强了 C# 的功能
注意:本文是在产品发行前编写的,因此无法保证内文细节与实际产品完全相符。本文的信息仅代表文件出版时产品的情况,只可作为计划时参考。文件中信息如有变更恕不另行通知。
 
  简介

  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() { }
}

  现在可用下列方式编写:

public static sealed class Environment
{
...
}

  利用静态类取代上述设计模式的优点,在于如果不慎声明“实例方法”,编译器可报告错误。


  编译器增强功能

  内嵌警告控制

  Whidbey 另一项新功能可让开发人员借助指定的编译器指令,控制是否要报告特定代码区域的警告信息。此指令与 #pragma 语句相当类似。以下 是使用 pragma 关键字的例子,可使编译器针对特定代码块,禁用错误报告。

#pragma warning disable 135
// Disable warning CS135 in this block
#pragma warning restore 135

  命令行选项

  Whidbey 包含数项编译器新选项。 以下是每种新选项的简要说明 :

  /warnaserror:在 Visual Studio .NET 2003 的 warnaserror 命令行选项中,可让开发人员将所有编译器警告皆以错误来处理。在 Whidbey 中,此功能进一步扩充,让开发人员控制是否要将特定的警告视作错误来处理。以下例子示范如何标示 618 之外的所有警告,将之视为错误来处理。

csc /warnaserror /warnaserror-:618?...

  另一种方式,则是如下列例子所示,将单一警告标示为错误:

csc "/warnaserror:1595 ...
/errorreport:<string>:errorreport

  命令行选项控制 Dr. Watson 产生编译器的报告。

  有关 Dr. Watson 的详细信息,参见:

www.microsoft.com/technet/prodtechnol/winxppro/proddocs/drwatson_setup.asp (英文)。

  以下为 errorreport 选项可用的参数:

/errorreport:prompt:此选项显示关于错误信息的对话框。

/errorreport:send: 此选项指示当编译器发现内部错误时,“毋须”用模式对话框提示用户。不过,编译器仍需继续编译,并传送错误报告。原本出现在 对话框中的文字,将显示在命令行。

/errorreport:none:此选项指示毋须将错误信息传送至 Microsoft。此行为同样见之于 Visual Studio 2002 与 Visual Studio 2003,是默认选项。
 
/langversion:<<string>:langversion 命令行选项的主要功能 是启用严格的 ECMA/ISO 一致性。当此选项设为 ISO-1,针对 Whidbey 所有不符合标准的功能,编译器皆报告错误。

/keycontainer、/keyfile、/delaysign:这些选项用来取代同一名称的属性,以便在指派命令行形参时有更大的弹性。


  生产力增强功能

  重构

  C# Whidbey IDE 现在可支持重构。“重构”可让开发人员在重建代码时,自动处理许多常见的工作。有关重构的详细信息,参见:www.refactoring.com (英文)。

  例如,开发人员利用内建的重构支持,可使用重新命名重构,在原始代码中自动重新命名变量的过程。

  目前在 Whidbey Technical Preview 中可用的重构功能为:

  撷取方法
  重新命名
  撷取接口
  封装栏位
  变更方法签署
  取代 Arraylist

  下图示范如何在代码编辑器中,从上下文菜单中直接使用重构功能。


图一 重构器菜单

  调用 [重命名] 重构时,将会出现 [预览变更] 对话框。此对话框列出变量名称在注释或代码中的位置。[预览变更] 对话框的上下文菜单也可让用户直接跳至 引用该变量的原始代码位置。


图二 重命名重构的预览变更

  代码展开

  代码展开可填补(fill-in-the-blank)代码片断,减少重复性工作的输入动作,并简化在应用程序中加入 foreach 语句等常见构造的过程。开发人员若要存取代码展开功能,可利用 上下文菜单并选取展开,或是直接利用可配置的代码展开快捷键。


图三 代码展开

  下面的代码展开例子示范了使用 forr 代码展开,以相反的顺序往返集合。 光标置于醒目提示的黄色文字区域,此处可作为用户配置值的占位符。下面例子中,forr 代码展开使用倒序顺序读取 myList 泛型集合中的每个元素。


图四 forr 代码展开

  代码展开为可扩充的 XML 文档,可由用户定制或创建。


图五 "forr" 代码扩充的 XML 格式


  格式化

  原始代码的格式化因人而异,Visual Studio Whidbey 包含数种选项,可让开发人员自定义和控制原始代码的格式。这些格式化选项包括大括号、间距、换行与对齐。您可以选择让 IDE 自动格式化代码,或仅格式化指定的原始代码区段。如图六所示,它示范了将大括号置于新的一行,并可视化预览所选格式化的选项。


图六 格式化选项与预览窗格

  配置文件

  虽然开发人员可充分自定义 IDE 的字体、窗口与格式化,但若要与团队成员共享配置,或要将配置转移至其它电脑,则是相当困难的工作。Whidbey 的新增功能可让您轻易地导入与导出 IDE 配置,以便在电脑之间转移,或团队成员彼此共享。


图七 导入与导出配置对话框

  增强 IntelliSense

  IntelliSense 已增强功能,以便识别泛型类型。在下图中,IntelliSense 了解 myList 代表整数列表,并提供弹出式菜单说明,指出 myList 的 Add 方法期望接受的整型数据类型。


图八 Intellisense 理解泛型类型

  IntelliSense 也增强了有关异常处理的能力。加入 try/catch 区块时,catch 处理例程将自动过滤可用的选项,仅显示异常类型的清单。


图九 处理异常的 IntelliSense

  IntelliSense 也增强了有关属性的功能。在下列例子中,加入属性时将过滤可用的选项,仅显示属性类型清单。


图十 处理属性的 IntelliSense


  用户类型与关键字彩色显示

  复审原始代码时,区分类型与关键字最好的方法便是在 IDE 中以不同颜色来显示。Whidbey 的新功能可用特殊的颜色来显示用户类型与关键字,从而加强了原始代码的可读性。


图十一 以不同颜色显示用户类型与关键字

  新的生成(Build)系统

  Whidbey 的生成系统已大幅加强。新生成系统称为 MSBuild,使用可扩充的机制来描述生成的过程。用户可利用 XML 编写自定义工作,自行建立其生成系统。以下例子示范一个简单的 MSBuild 文档,其编译工作调用 C# 编译器,编译所有扩展名为 .cs 的文件。

- <Project>
<Item Type="Compile" Include="*.cs" />
- <Target Name="Build">
<Task Name="Csc" Sources="@(Compile)" />
</Target>
</Project>

  缺省可搜寻隐藏文字

  对于 [寻找和替换] 窗口最常见的要求,是希望改变默认设置,以便缺省设置可搜寻已摺叠的文字 (例如,区域内的文字)。在 Visual Studio 2003 中,缺省设置不能搜寻隐藏文字,Whidbey 缺省设置则可搜寻隐藏文字。


图十二 在寻找和替换对话框中搜寻隐藏文字

  对象浏览器的改进

  开发人员经常使用对象浏览器来检视数据类型,许多开发人员希望加入结果过滤功能。Whidbey 的对象浏览器可让开发人员根据命名空间、对象类型、字母顺序等等条件来过滤与排序数据。


图十三 对象浏览器的改进


  更易使用的窗口停靠功能

  为了让在 IDE 中更易使用窗口停靠功能,现在提供了透明向导,可用来将窗口停靠于 IDE 的左、右与底端。


图十四 停靠窗口

  IDE 的自动存储功能

  为了避免遗失信息 (例如,不小心关闭尚未保存修改的文件),IDE 现在可定期自动存储您的工作。若 IDE 当掉,重新启动后,将询问您是否要复原您的工作。


图十五 自动保存文件

  变更追踪

  变更追踪可让您轻易地看出存储与未存储代码之间的差异。

  在下图中,您将发现最左边窗格某些区段的代码以不同颜色来显示。以黄色显示的代码,代表尚未存储的新代码;以绿色显示的代码,代表已存储的新代码。既非黄色也非绿色的代码,代表一开启文件时便已存在的代码。


图十六 变更追踪

  新的 Windows Forms 控件

  Whidbey 的 Windows Forms 新增数种控件,从改进的数据显示控件 (例如,GridView),到全新的控件,如可播放音乐的 Sound 控件),以及可自定义菜单的 Winbar 控件。


图十七 Winbar 控件

  新 Web Forms 控件

  ASP.NET 加强了数种功能,可大幅提升开发人员的生产力。这些功能部份包含在 ASP.NET 的新控件类中,例如,“个人化”、“安全性”、“验证”与“浏览”。

  控件对齐

  在 Whidbey 中,在设计工具中更容易对齐控件。在下列例子中,当用户拖曳 button 2 时,将出现一组对齐线,以视觉化的方式显示 button 1 如何对齐 button 2。


图十八 对齐控件

  控件的智能标签

  控件中加入了“智能标签”,用来显示与该控件关联的常见工作,例如,格式化与连接数据源。


图十九 控件的智能标签

  建立 Web 项目更快捷

  若要在 Whidbey 中建立 Web 项目,不需要先行安装 IIS。只要选取要建立的网站,Visual Studio 可让您在文件共享点建立网站,以便在本机上执行与调试。

  Yukon 项目支持

  Visual Studio Whidbey 也支持生成 SQL Server 下一版 (代号为 Yukon) 的应用程序。


图二十 建立 SQL Server 的 Yukon 项目


  调试工具增强功能

  增强 Datatips

  在 Visual Studio .NET 2003 的调试模式中,只要将光标置于简单的变量上 (例如,字符串),便可显示变量值。Whidbey 大幅增强此功能,以处理更复杂的类型。在下图中,Datatips 显示复杂类型的信息,并可详细显示该类型的层次信息。


图二十一 增强的 Datatips

  可视化工具

  在 Visual Studio .NET 2003 中,要在调试工具中检视 Datasets、bitmaps 等复杂类型并不容易。可视化工具可在调试模式中,以 可视化的方式来表示数据。例如,可依下图所示的方式,直接从自动变量窗口(Autos Window)中选取 XML 可视化工具,以便以可视化的方式来表示 XML 字符串的内容。可视化工具可加以扩充,让开发人员与组件供应商可为自定义类型自行建立可视化的方式。


图二十二 可视化工具选项


图二十三 XML 可视化工具

  新的符号服务器选项

  若要在 Visual Studio 2003 中使用符号服务器,必须配置如下的系统环境变量:

_NT_SYMBOL_PATH=srv*E:\Cache\Symbols*http://msdn.microsoft.com/download/symbols;

  这必须在调试之前执行。在 Whidbey 中,比较容易配置多个符号服务器位置,以及配置本机符号快取的路径。您可以在进入中断模式后再配置符号 服务器,当您知道调试符号尚未载入时,此功能相当有用。


图二十四 符号服务器选项

  设计时表达式评估

  在 Whidbey 中,即时窗口(Immediate window)可用来在设计时评估表达式,而毋须编译与执行应用程序。 在下面例子中,直接从即时 窗口调用 Add 方法,毋须离开设计时环境。


图二十五 设计时在即时窗口中评估方法

  可配置的安全权限

  Whidbey 可让开发人员配置不同的安全权限来调试应用程序,简化以不同安全特性认证信息来测试的过程。


图二十六 可配置的安全权限

  小结

  Visual Studio Whidbey 建立在 Visual Studio 2002 与 Visual Studio 2003 的成就之上,让开发人员具有更高的生产力。包括新语言构造、编译器功能、生产力增强功能,以及调试工具增强功能等等,使得开发人员能够以更短的时间建立功能更强大的应用 程序,并专注于编写代码。


原文转自:http://www.ltesting.net

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)