符号重命名
如果您和许多开发人员一样,那么当开始一个新的 Visual Basic .NET 项目时,您会倾向于使用窗体、控件以及其他代码元素的默认名称。一段时间之后,当应用程序逐渐成形,您就会根据所在组织使用的命名规则来重新命名这些项。如果您的目标是编写专业的代码,这就是一项乏味却又必要的苦差事。符号重命名工具提供了一种简单易用的全局更新名称的方法,有助于减轻重命名代码元素的繁重工作,并降低引入额外语法错误的风险。要在代码编辑器中使用这项功能,可以右键单击代码中的某一项,并从上下文菜单中选择“Rename”,如图 26 所示。
图 26 从代码编辑器访问符号重命名工具。
在“Rename”对话框中,键入该符号的新名称,如图 27 所示。
图 27 重命名对话框。
调试器的增强功能
Visual Studio 2005 提供许多工具来查看调试环境中的数据。其中许多工具(例如 Watch、Locals 和 Autos 窗口)一直用于 Visual Studio 的多个版本。这些工具提供应用程序数据的多个不同视图。但是您仍然可能遇到调试时很难检查数据的情形。在接下来的章节中,我们将探讨调试器环境和工具的增强功能,这些增强功能可以使您更容易地在运行时诊断和更正错误。
DataTip DataTip 一直是一种在调试器中快速查看简单数据类型的好方法。但是,在 Visual Studio 的早期版本中,对于复杂的数据类型,只能看到类型的名称而不是其中包含的数据,如图 28 所示。Visual Studio 2005 中 DataTip 的关键改进是它们现在可以显示复杂数据类型的成员,如图 29 所示。
图 28 简单数据类型。
图 29 复杂数据类型。
DataTip 的另一个增强功能是为简单类型和复杂类型的每个成员提供上下文菜单。该上下文菜单包含以下选项:添加查看所选类型、编辑该类型的值或查看该类型的十六进制值。(请参见图 30。)

图 30 DataTip 选项。
您也可以直接在 DataTip 中编辑成员值,方法是选择该值,然后键入其新值来替换它,如图 31 所示。

图 31 更新成员值。
完成成员变量的更改后,DataTip 会自动显示更新的值,如图 32 所示。

图 32 更新之后的成员值。
Visualizer
Visual Studio 2005 调试器的一个更复杂的数据检查工具是 visualizer。Visualizer 是一个对话框,它将变量或对象以对特定数据类型有意义的方式进行显示。例如,使用 Visual Studio 2005 中包含的四个默认 Visualizer 之一,可以以 HTML、XML 或纯文本的形式可视化字符串变量。
所有各种不同的调试工具 — DataTip、Watch 窗口、Locals 窗口或 Autos 窗口 — 都在可用 Visualizer 查看的数据类型旁边显示一个放大镜图标。单击放大镜可以选择一个 Visualizer 来显示相应对象的数据类型。
除了刚才提及的三个基于文本的 Visualizer 之外,默认情况下还包含一个数据集 Visualizer,使用该 Visualizer 可以更方便地检查数据集中包含的数据。
提示其他 Visualizer 将来可以从 Microsoft 下载获得。
异常助手
异常助手是 Visual Studio 2005 引入的一个新调试工具。当一个运行时异常发生时,它将以一个对话框的形式出现,显示关于该错误的细节。值得一提的是,该异常助手对话框还包括处理异常的故障诊断提示。
该对话框的标题栏显示错误的类型,标题栏下方是对错误的描述。该助手的顶部是故障诊断提示部分,它在大多数情况下都会提供一些指向帮助内容的链接,以帮助您诊断问题。然而,在许多情况下,此助手会为更正错误提供循序渐进指导。
自定义数据显示
Visual Studio 2005 为在调试器中自定义数据显示提供了几个选项。接下来的一节介绍了三种用于操作调试器中显示数据方式的方法。
重写自定义类型的 ToString 方法
要改变调试器中显示的自定义类型的数据,一种最简单的方法是重写基对象 ToString方法,如下所示:
Overrides Function ToString() As String
Return Me.FirstName & ““& Me.LastName
End Function
使用调试器显示属性
其他的情况可能需要对数据如何显示进行更多的控制。您可能想按照不同的方式设置基础数据的格式,或者限制在调试器中显示的数据量。.NET Framework 为控制数据在调试器中的显示方式提供了三个属性类:
| DebuggerDisplayAttribute应用该属性为调试器数据窗口中的类型添加摘要。例如,下面的代码显示如何向一个自定义数据类型添加摘要:
<DebuggerDisplay(“Associate ( { FullName } “) >_
Public Class Associate
Private FullName as String
. . .
End Class
DebuggerDisplayAttribute的构造函数接受字符串格式规范。大括号内的文本表示所包含类的一个属性或方法。请注意,可以使用该类的私有成员和公共成员。
|DebuggerBrowsableAttribute将此属性应用于类中的成员,以控制它是否在调试器中显示。
Public Class Associate
<DebuggerBrowsable( False ) > _
Public Property SocialSecurityNumber As String
. . .
End Property
End Class
在前面的伪代码中,将 DebuggerBrowsableAttribute应用于
Associate 类的 Social-SecurityNumber属性将阻止该属性在调试器窗口中显示。
| DebuggerTypeProxyAttribute该属性允许以一个自定义的调试器类型来替换属性化成员,从而提供了极大的灵活性。
<DebuggerTypeProxy( GetType( AssociateProxy ) )> _
Public Class Associate
. . .
End Class
DebuggerTypeProxyAttribute构造函数的输入参数指定一个类,此类用作显示该类型数据的代理。作为一种最佳做法,应该将该代理类实现为它所应用的数据类型的一个嵌套内部类。这样,该嵌套类就可以对其所描述的类型的私有成员进行完全访问。
演练
该演练演示如何使用类设计器来构建并可视化地构造一个类的层次结构。
此应用程序是一个类库,用于表示一个虚构的专业服务公司的数据实体。该类代表两种类型的员工实体,一种是 partner,另一种是 associate。
这些实体分别使用
Partner 和
Associate 类在类库中建模。因为它们共享许多公共属性和操作,所以
Partner 和
Associate 类均派生于
Employee 基类,而
Employee 又派生于称为
Person 的其自身的基类。
另外,设计要求
Partner 和
Associate 类可序列化,并且这些类本身在序列化过程中可执行自定义代码。为达到此目标,这两个类均实现 System.Runtime.Serialization命名空间中包含的 ISerializable接口。
抽象的
Employee 类还实现一个名为 IPerks 的自定义接口,该接口包含在项目中。该接口满足此项目的一个设计目标,即提供一种方式以建模不同类别员工的福利,因此该接口的实现对于每个派生于
Employee 类的类型而言均不相同。
包含在项目文件中的是 ClassDiagram1.cd 文件,它由类设计器工具生成。如果在 Visual Studio 2005 的文档窗口中打开此文件,会看到它为类库提供对象层次结构的可视化表示。虽然这个特定的示例相对比较简单,但此关系图可以使您立即理解类库中各种不同类之间的关系。还可以使用类设计器来更改类的任何属性或关系。因为类设计器与 Visual Studio 2005 IDE 紧密集成,所以对关系图中的对象所做的任何更改都会立即反映到基础代码文件中。
小结
Visual Studio 2005 集成开发环境包括许多新的和改进的用于提高工作效率的功能。IDE 还进行了重新设计,从而向开发人员提供对 .NET Framework 组件(如新的设置和资源体系结构)的更直接访问。