2.9 使用Visual Studio 2005构建.NET应用程序
假定你是一位职业.NET软件工程师,很有可能公司会购买微软最重要的IDE——Visual Studio 2005(http://msdn.microsoft.com/vstudio)。这个工具无疑就是本章中功能最丰富、适用于企业的IDE。当然,一分钱一分货,价格随着所购买的Visual Studio 2005的版本不同而不同。你可能会不信,但是各个版本都具有不同的功能。
在本书余下部分,假定你选中Visual Studio 2005作为IDE。但要知道的是,对于学习本书,Visual Studio 2005并不是必需的。在最坏的情况下,本书会论及你使用的IDE不支持的某个选项。不过请放心,本书的全部示例代码在你所选用的工具进行处理时都可以正常编译。
注解 从Apress网址(http://www.apress.com)的下载区域下载了本书的源代码后,你可以通过双击示例的*.sln文件将当前示例加载到Visual Studio 2005里。如果没有使用Visual Studio 2005,你需要对IDE进行手工配置以编译所提供的*.cs文件。
2.9.1 Visual Studio 2005
Visual Studio 2005配备有我们所期望的GUI设计器、数据库操作工具、对象和项目浏览工具以及集成的帮助系统。与我们提过的那些IDE不同,Visual Studio 2005提供了众多的附加功能。下面是其中的一部分:
l Visual XML编辑器/设计器;
l 支持移动设备开发(例如智能手机和掌上电脑);
l 支持微软Office开发;
l 具有跟踪给定源文档变化并查看变化内容的能力;
l 集成对代码重构的支持;
l 基于XML的代码扩展库;
l 可视类设计工具和对象测试工具;
l 代码定义窗口(该窗口替换了Windows窗体类查看器wincv.exe的功能,查看器wincv.exe是随.NET 1.1以及更早版本配备的)。
坦白地讲,Visual Studio 2005提供了如此多的功能,以至于需要一大本书来完整地描述IDE的各个方面[2],但这不是本书的目标。然而,我将在后面几页中给出Visual Studio 2005的一些主要改进,你可以了解到Visual Studio 2005 IDE的更多内容。
2.9.2 Solution Explorer工具
下面我们使用File→New→Project菜单选项创建C#控制台应用程序(名为Vs 2005Example)。Solution Explorer工具可以从View菜单得到,它可以用来查看构成当前项目的所有文件和被引用的程序集的集合(如图2-17所示)。
注意,Solution Explorer的References文件夹显示了当前已经引用的各个程序集(默认状态下,控制台项目引用System.dll、System.Data.dll和System.Xml.dll)。当需要引用更多的程序集时,右击References文件夹并选择Add Reference项。此时就可以从结果对话框中选择程序集。
注解 Visual Studio 2005 现在允许对可执行程序集设置引用(与Visual Studio .NET 2003仅限*.dll 代码库不同)。
最后,注意在Solution Explorer内有一个名为Properties的图标。当你双击该图标时会呈现一个增强的项目配置编辑器(如图2-18所示)。
|
|
|
|
图2-17 Solution Explorer |
图2-18 Project Properties窗口 |
后面在其他内容的讲述中你将看见Project Properties窗口的各个方面。但是,只需花点时间研究一下,就会明白在这个窗口可以建立各种安全设置、强命名程序集、插入字符串资源并对预先和事后构建的事件进行配置。
2.9.3 Class View工具
下一个要讨论的工具是Class View工具,可以在View菜单下使用该功能。同SharpDevelop一样,该工具的目的是从面向对象角度显示当前项目里的所有类型。顶部的窗格显示了一组命名空间及其类型的集合,而底部的窗格显示了当前所选择的类型的各个成员(如图2-19所示)。
2.9.4 Code Definition窗口
如果你有使用.NET 1.1进行编程的背景,就可能会比较熟悉Windows Forms Class Viewer(Windows窗体类查看器)工具wincv.exe。该工具允许键入一个.NET类型的名字并查看其C#定义。当wincv.exe的作用随着.NET 2.0的发布而降低时,该工具的增强版已经与Visual C# 2005 Express和Visual Studio 2005实现了集成。可以在View菜单下启动Code Definition窗口。只需要移动鼠标光标到C#代码文件的任一类型上,正在讨论的类型的截屏图就会呈现。例如,如果你单击Main()方法内的词string,就可以找到System.String类类型的定义(如图2-20所示)。

图2-20 Code Definition窗口
2.9.5 Object Browser工具
回想一下第1章所介绍的内容,Visual Studio 2005也提供了一个工具检查在当前项目内被引用的程序集。选择View→Other Windows菜单启动Object Browser,然后选择希望检查的程序集(如图2-21所示)。

图2-21 Visual Studio 2005 Object Browser工具
2.9.6 集成对代码重构的支持
Visual Studio 2005所配备的一个主要增强是对既有代码进行重构的内在支持。简单地说,重构(refactoring)是一个正规、严格的过程,目的是改善既有的代码。[3]过去,代码的重构通常需要大量的手工劳动。幸运的是,Visual Studio 2005可以完成大量自动重构的工作。在Refactor菜单下有相关的键盘快捷键、智能标签以及与上下文相关联的鼠标单击,你可以以最少的代价重组代码。表2-4定义了可以由Visual Studio 2005识别的一些常见的重构。
表2-4 Visual Studio 2005的重构
|
重构技术 |
作 用 |
|
Extract Method(提取方法) |
允许定义一个基于所选择的代码语句的新方法 |
|
Encapsulate Field(封装字段) |
把一个公共的字段转化为一个由C#属性封装的私有字段 |
|
Extract Interface(提取接口) |
定义一个基于现有类型成员集的新接口类型 |
|
Reorder Parameters(重排参数) |
提供了一种重新排序成员实参的方式 |
|
Remove Parameters(除去参数) |
从参数的当前列表中除去给定的实参(如你期望的那样) |
|
Rename(重命名) |
允许在整个项目期间重新命名代码标记(方法名字、字段、局部变量等) |
|
Promote Local Variable to Parameter(提升局部变量为参数) |
把一个局部变量移到定义方法的参数集 |
为了阐明重构是如何实现的,用以下代码修改Main()方法:
static void Main(string[ ] args)
{
// 建立Console UI(CUI)。
Console.Title = "My Rocking App";
Console.ForegroundColor = ConsoleColor.Yellow;
Console.BackgroundColor = ConsoleColor.Blue;
Console.WriteLine("*************************************");
Console.WriteLine("***** Welcome to My Rocking App *****");
Console.WriteLine("*************************************");
Console.BackgroundColor = ConsoleColor.Black;
// 等待按键以关闭。
Console.ReadLine();
}
虽然上述代码本身正确无误,但是想象一下,如果需要在程序中各个位置上都显示这提示,情形将会怎样?为避免不断重复输入相同的控制台用户界面逻辑,理想情况是有一个可以调用的辅助函数来完成这个工作。因此,你将对既有的代码应用Extract Method重构。首先,在编辑器内选择(除对Console.ReadLine()的最后一次调用以外的)各个代码语句。然后,右击并从Refactor上下文菜单选择Extract Method选项。在结果对话框里把新方法命名为ConfigureCUI()。完成后,你将发现Main()方法调用了新生成的ConfigureCUI()方法,后者现在包含了前面所选择的代码:
class Program
{
static void Main(string[] args)
{
ConfigureCUI();
// 等待按键以关闭。
Console.ReadLine();
}
private static void ConfigureCUI()
{
// 建立Console UI(CUI)。
Console.Title = "My Rocking App";
Console.ForegroundColor = ConsoleColor.Yellow;
Console.BackgroundColor = ConsoleColor.Blue;
Console.WriteLine("*************************************");
Console.WriteLine("***** Welcome to My Rocking App *****");
Console.WriteLine("*************************************");
Console.BackgroundColor = ConsoleColor.Black;
}
}
注解 如果想了解重构过程的更多信息和Visual Studio 2005所支持的各个重构,可以在网址http://msdn. microsoft.com在线查阅我的文章Refactoring C# Code Using Visual Studio 2005。
2.9.7 代码扩展和围绕技术
Visual Studio 2005(以及Visual C# 2005 Express)也具有使用菜单选项、上下文关联的鼠标单击以及或键盘快捷键插入C#代码块的能力。可用的代码扩展数量是惊人的,并可分为两个大类。
l 片段:这类模板在鼠标光标位置处插入公共代码块。
l 围绕:这类模板在一个相关作用域内封装被选定语句的块。
为了直接领会这个功能,在Main()方法内右击一个空白行并启动Insert Snippet菜单。选择了某个项之后,你会发现相关代码被自动扩展了(按下Esc键关闭弹出菜单)。
如果右击并选择Surround With菜单,同样地,你面前会呈现一连串的选项。要确保花一点儿时间浏览这些预定义的代码扩展模板,因为它们能够大幅度加快开发的速度。
注解 所有代码扩展模板都是对IDE内代码的基于XML的描述。使用Visual Studio 2005(以及Visual C# 2005 Express)可以创建定制的代码模板。具体实现的细节可以到http://msdn.microsoft. com查看我的文章Investigating Code Snippet Technology。
2.9.8 可视化Class Designer
Visual Studio 2005具备可视化设计类的能力(但这种能力在Visual C# 2005 Express里不具备)。这种Class Designer工具允许在项目里查看和修改各个类型的相互关系(类、接口、结构、枚举和委托)。使用这种工具能够可视化地对一个类型增加(或者去除)成员,并且所做的修改得以反映在对应的C#源代码文件里。同样,当修改一个给定的C#源代码文件时,所做修改会反映在对应的类图里。[4]
为了能够使用Visual Studio 2005的这一功能,第一步是插入一个新的类图文件。这有许多方法可以实现,其中的一个方法是单击位于Solution Explorer右侧的按钮View Class Diagram(如图2-22所示)。
完成之后,在当前项目里就将出现表述各个类的类图标。如果单击了箭头图像,就可以显示或隐藏该类型的成员(如图2-23所示)。
|
|
|
|
图2-22 插入类图文件 |
图2-23 Class Diagram查看器 |
该工具与Visual Studio 2005的其他两个功能结合发挥作用:Class Details窗口(通过View→Other Windows菜单启动)以及Class Designer Toolbox(通过View→Toolbox菜单项启动)。Class Details窗口不仅仅显示图中当前所选项的细节,而且允许在执行状态下修改已有成员并插入新成员(如图2-24所示)。
Class Designer Toolbox(如图2-25所示)允许可视化地在项目里插入新的类型(并且在这些类型之间创建关联关系)。(需要注意的是,你必须有一个类图作为活动窗口来查看该工具箱。)完成后,IDE自动在后台创建新的C#类型定义。
|
|
|
|
图2-24 Class Details窗口 |
图2-25 使用可视Class Designer插入新的类 |
举个例子,从Class Designer Toolbox里拖入一个新的类到Class Designer上。在结果对话框里将该类命名为Car。接着,使用Class Details窗口,增加一个名为petName的公共字符串字段(如图2-26所示)。

图2-26 用Class Details窗口增加字段
如果现在查看Car类的C#定义,你会看到它已经相应地被修改了:
public class Car
{
// 公共数据通常不好用;但是它让本例保持简单。
public string petName;
}
在设计器中增加另一个新的类SportsCar。现在,从Class Designer Toolbox里选择Inheritance图标并单击SportsCar图标的顶部。按住鼠标左键不放,把鼠标移到Car类图标的顶部。一切无误的话,就已经从Car派生出了SportsCar类(如图2-27所示)。

图2-27 从现有的类可视地派生新的类
为了完成本例,用一个名为PrintPetName()的公共方法更新所生成的SportsCar类,如下所示:
public class SportsCar : Car
{
public void PrintPetName()
{
petName = "Fred";
Console.WriteLine("Name of this car is: {0}", petName);
}
}
2.9.9 对象测试平台
Visual Studio 2005提供了另一个很好的可视工具Object Test Bench(OTB,对象测试平台)。这个功能可以快速创建一个类的实例并调用其成员,无需编译并运行整个应用程序。这对于在希望测试一个具体方法而不想逐行执行几十行代码来实现的情况下极为有用。
为了能够使用OTB,在Class Designer下右击希望创建的类型。例如,右击SportsCar类型,并从导出的上下文菜单下选择Create Instance→SportsCar()。这一步将显示一个允许对临时对象变量命名的对话框(如果需要,还应提供构造函数实参)。一旦完成这个过程,你将发现该对象被放入IDE内。右击对象图标并调用PrintPetName()方法(如图2-28所示)。

图2-28 Visual Studio 2005的OTB
将看到信息“Name of this car is: Fred”出现在Visual Studio 2005快速控制台内。
2.9.10 集成的帮助系统
Visual Studio 2005的最后一个功能肯定会让你从一开始就感觉很舒服,那就是完全集成的帮助系统。.NET Framework 2.0软件开发包的文档系统非常出色,可读性很强,并且包含充足的有用信息。由于有大量预定义的.NET类型(数量有上千个之多),你必须卷起袖子深入学习文档系统。如果不这样做,作为.NET的程序开发员,你注定会承受一个漫长、令人沮丧而痛苦的过程。
Visual Studio 2005提供了Dynamic Help(动态帮助)窗口,该窗口里的内容将基于当前所选的项(窗口、菜单、源代码关键字等)而动态地变化。例如,如果把光标放在Console类上,Dynamic Help窗口会显示和System.Console类型相关的一组链接。
你还应该意识到,.NET Framework 2.0 SDK文档拥有一个非常重要的子目录。在文件系统的.NET Development→.NET Framework SDK→Class Library Reference节点下,你会得到.NET基类库里的各个命名空间的完整文档(如图2-29所示)。

图2-29 .NET基类库引用
其中每一本“书”都定义了给定命名空间里的类型集合、给定类型的成员以及给定成员的参数。另外,当对给定类型查看帮助页时,都将提供程序集的名字和包含了所讨论类型的命名空间(位于该页的顶部)。在本书下面的讲述中,都假定你会深入这个极为关键的文档,研究正在讨论的实体的其他细节。












