Visual Studio 2015高级编程(第6版)
上QQ阅读APP看书,第一时间看更新

4.1 代码编辑器

开发人员会花费大量时间编写代码,所以知道如何改变代码的布局并高效地浏览它们是非常重要的。基于WPF的代码编辑器提供了许多功能,包括导航、格式化、使用多台显示器、创建选项卡组、搜索等。

4.1.1 代码编辑器窗口的布局

打开代码文件进行编辑时,我们就在代码编辑器窗口中工作,如图4-1所示。代码编辑器窗口的核心是显示代码的代码窗格。

图4-1

在代码窗格的上方是三个下拉列表,用于导航代码文件,称为导航栏。使用Options 对话框(Tools | Options)的Text Editor | All Language | General节点可以打开和关闭它。也可以给某种语言打开和关闭它。

第一个下拉列表列出了文件所在的项目。这是一个新功能,用于支持Visual Studio提供的共享文件功能。第二个下拉列表列出了代码文件中定义的类,第三个下拉列表列出了在第二个下拉列表中选择的类的成员。这些元素都按字母顺序排列,以便于在文件中查找方法或成员定义。

下拉列表并非适用于Visual Studio中的每个代码编辑器窗口。编辑器窗口的外观因当前编辑的文件类型而异。例如,JavaScript文件没有下拉列表,C#和Visual Basic有下拉列表。另外,如果使用第三方插件,如ReSharper或CodeRush,就可能有不同的行为和选项。

在代码编辑器窗口中修改代码时,自打开文件以来修改的代码行会在左页边距加上标记,黄色表示未保存的修改,绿色表示已保存的修改。

4.1.2 区域

有效的类设计通常会使类只有单一的用途,而且不会很复杂或很长。但是有时必须实现非常多的接口,这样代码文件就变得比较混乱。此时有许多选项可以解决这个问题,如把代码划分到多个文件中,或者使用区域折叠代码,以便于浏览。

部分类(类的定义可以放在两个或多个文件中)的引入,表示在设计时可以把代码放在单个逻辑类的不同物理文件中。使用多个文件的好处是可以高效地组合相关的所有方法,例如,实现某个接口的方法。该方法的缺点是浏览代码时需要连续不断地在代码文件之间切换。

另一种方式是使用指定的代码区域来折叠当前不使用的代码部分。在图4-2中,定义了两个区域Constructor和Event Handlers。单击#Region旁的减号会把该区域折叠为一行,单击加号会再次展开该区域。

图4-2

不展开区域也可以查看其中的代码。只要把鼠标指针停放在区域上,其中的代码就会显示在一个工具提示中。

4.1.3 大纲

除了前面定义的区域外,Visual Studio 2015还可以自动给代码添加大纲,以便折叠方法、注释和类定义。自动化大纲默认是启用的,但如果没有启用,则可以使用Edit | Outlining | Start Automatic Outlining菜单项启用它。

图4-3显示了4个可折叠区域,一个是已定义的区域Constructor,其他3个可自动添加大纲的区域分别包含了类、XML注释和构造函数(已折叠)。自动化大纲的折叠和展开方式与手动定义的区域相同。

图4-3

Edit | Outlining菜单提供了许多命令,可以帮助折叠和展开大纲,例如折叠整个文件,只显示方法/属性定义(Edit | Outlining | Collapse to Definitions),再次展开它以显示所有折叠的代码(Edit | Outlining | Stop Outlining)。另一种折叠和展开区域的方式是通过快捷键Ctrl+M、Ctrl+M,可以在两个布局之间切换。

C#开发人员可以利用的一个技巧是,使用Ctrl+]快捷键可以方便地从区域、大纲或代码块的开头浏览到末尾,再返回。

4.1.4 代码的格式化

Visual Studio 2015默认通过自动缩进和对齐代码来帮助编写出可读性好的代码。但是,这也是可以配置的,以便控制代码的排列方式。所有的语言都可以控制创建新代码行时发生的操作。在图4-4中,Options对话框的Text Editor | All Languages节点下有一个Tabs节点。在这里设置值可以为所有语言定义默认值,以后可以使用Basic | Tabs节点(用于VB.NET)、C# | Tabs或其他语言节点,为某种语言重写该默认值。

图4-4

C#和VB.NET的默认缩进操作是智能的,在打开和关闭代码块时会自动缩进代码。但智能缩进功能并不是所有语言都具备的,没有该功能的语言要使用块缩进功能。

如果使用的屏幕较小,就应减少Tab和缩进的量以优化屏幕的使用。保持Tab和缩进的量相同,更便于通过按一次Tab键来缩进代码。

在这个对话框中,一个有趣之处是C#用户对代码布局的控制程度。在VB Specific节点的下面有一个复选框Pretty Listing (Reformatting)of Code,选中该复选框会使代码看起来非常整齐,而不必对齐方法、括号、类定义以及名称空间;而C#用户可以控制代码编辑器重新格式化代码的几乎所有方面。

在代码编辑器中编写或粘贴代码时,Visual Studio的Smart Indenting功能可以自动缩进代码,但偶尔会遇到没有正确格式化的代码,这些代码很难阅读。为了让Visual Studio重新格式化整个文档,设置括号的位置和行缩进,可以选择Edit | Advanced | Format Document命令或按下Ctrl+K、Ctrl+D快捷键。要仅格式化选中的代码块,可以选择Edit | Advanced | Format Selection命令,或按下Ctrl+K、Ctrl+F快捷键。

编写代码时,要把整个代码块都缩进一级,而不是单独修改每一行,只需要选择该代码块,按下Tab键。每一行代码都会在开头插入一个制表符。要取消代码块的一个缩进级别,只需要选择该代码块,按下Shift+Tab快捷键。

注意Edit | Advanced菜单下的Tabify/Untabify Selected Lines命令,它们与Format Selection命令有什么区别?这些命令仅把代码行开头的空格转换为制表符,或把制表符转换为空格,而不像Format Selection命令那样重新计算缩进量。

4.1.5 向前/向后

在项内或项之间进行切换时,Visual Studio 2015会跟踪用户的访问记录,其方式类似于Web浏览器跟踪用户访问的站点。使用View菜单下的Navigate Forward和Navigate Backward菜单项,可以很方便地在项目中已修改的位置之间切换。向后切换的快捷键是Ctrl+–,而向前切换的快捷键是Ctrl+Shift+–。

4.1.6 其他代码编辑器功能

Visual Studio代码编辑器有非常丰富的功能,本章不可能深入讨论它们,只介绍几个有用的功能。

1.引用的突出显示

一个优秀的功能是引用的突出显示,也称为Code Lens。所有符号(如方法或属性)只要在其作用域内,它的所有引用就会突出显示(如图4-5所示),这便于确定在代码的哪些地方使用了该符号。使用Ctrl+Shift+ Up/Down很容易在各个引用之间切换。

图4-5

2.代码的缩放

使用Ctrl+鼠标滚轮可以缩放代码(使文本变大或变小)。这个功能尤其适用于给一个小组显示代码,使离得最远的人也能看到所演示的代码。代码编辑器的左下角还有一个下拉列表,允许选择某些预定义的缩放级别。

3.自动换行

使用选项可以打开代码编辑器中的自动换行功能。为此应进入Tools | Options,展开Text Editor节点,选择All Languages子节点,再选择Word Wrap选项。还可以选择Word Wrap选项下面的Show Visual Glyphs for Word Wrap选项以显示文本换行符。

选择Edit | Advanced | Word Wrap命令,也可以为当前项目打开这个功能。

4.行号

为了跟踪用户在代码文件中的位置,可以在代码编辑器中显示行号,如图4-6所示。要显示行号,可以进入Tools | Options,展开Text Editor节点,选择All Languages子节点,再选择Line Numbers选项。

图4-6

Visual Studio 2015包含一个名为Heads Up Display的代码编辑器功能。在图4-6中,请注意关于类声明和方法签名的小段文本(分别是2 references和0 references,以及执行了多少未提交的更改等信息)。这段文本表明类或方法在项目的其他地方引用的次数。

如果单击文本,将显示一个弹出窗口(如图4-7所示),其中包括一些有关引用的有用细节。这包括引用所在的文件名和行号。

图4-7

5.自动补全括号

Auto Braie Complete是Productivity Power Tools中的一项流行功能,当你在编辑器中输入代码时,该功能会自动补全右边的圆括号、引号、中括号和大括号。该功能可识别语言,例如,C++中的注解会自动补全,而如果在C#编辑器中输入同样的内容,则不会自动补全。

如果双击一个引用,文件就在编辑器窗口中打开,光标位于引用方法或类的代码行上。把鼠标悬停在一个引用上,会显示一个弹出窗口;该窗口不仅包含悬停鼠标的代码行,还包含该行前后的两三行,以便查看有关引用的更多细节,而不必直接导航到该文件。

4.1.7 分割视图

有时希望同时显示同一代码文件的两个不同部分。分割视图就可以实现这个功能,它把活动的代码编辑器窗口分割为两个水平窗格,用一个分割栏隔开。这些窗格可以分别滚动,以同时显示同一个文件的不同部分,如图4-8所示。

图4-8

要分割代码编辑器窗口,应从Window菜单中选择Split命令,或者向下拖动垂直滚动条上的句柄来定位分割栏。

上下拖动分割栏,可以调整每个窗格的大小。要删除分割栏,只需要双击分割栏,或者从Window菜单中选择Remove Split命令。

4.1.8 代码窗口的分离(浮动)

如果有多个显示器,一项优异的功能是把代码编辑器窗口(和工具窗口)分离出来,或使该窗口变成浮动的,把它们移到主Visual Studio IDE窗口的外部,如图4-9所示,包括移到另一个显示器上。这样就可以使多个代码编辑器窗口同时显示在不同的显示器上,以使用多台显示器提供的额外的屏幕空间。还可以将这些分离的窗口放在一个“漂浮”区域上,从而可以同时移动它们,如图4-10所示。要分离一个窗口,应确保该窗口获得焦点,再从Window菜单中选择Float命令;或右击窗口的标题栏,从下拉菜单中选择Float命令;又或者单击并拖动该窗口的标签(把它从停靠的位置拉开),再定位到需要的位置。

图4-9

图4-10

把代码编辑器窗口显示在分割视图中(参见4.1.7节),以同时显示同一个文件的不同部分时,代码视图可能过小。此时就可以使用代码窗口浮动功能,而不是为同一个文件打开另一个代码编辑器窗口,并放在(例如)另一个屏幕上(假定设置了多个显示器)。其技巧(因为在Solution Explorer窗口中再次双击文件,只会为该文件激活已有的代码编辑器窗口实例)是从Window菜单中选择New Window命令,这会在另一个窗口中打开当前查看的文件,之后就可以根据需要分离该窗口,定位到另一个地方。

4.1.9 复制Solution Explorer

在多显示器环境中工作时,会注意到Visual Studio以前版本中的一个限制:一次只可以使用Solution Explorer的一个副本。在Visual Studio 2015中,已经取消了这一限制。右击Solution Explorer中的某个元素并选择New Solution Explorer View命令,就会创建一个新的浮动Solution Explorer窗口。现在可以四处移动该窗口,如同移动前面描述的窗口一样。图4-11显示了一个新创建的Solution Explorer。

图4-11

4.1.10 创建选项卡组

即使没有多个显示器,也仍可以同时显示多个代码编辑器窗口。为此,需要创建选项卡组,将这些选项卡组平铺显示。顾名思义,选项卡组是一组代码编辑器窗口选项卡,每个选项卡组都单独平铺显示。可以创建多个选项卡组,唯一的限制是它们占用的屏幕空间。可以水平或垂直平铺选项卡组,但不能同时水平和垂直平铺。

要开始这个过程,需要把选项卡拖到已有选项卡的下面或旁边,使之停靠在已有选项卡上,也能获得相同的效果。这会启动一个新的选项卡组,并为它创建一个面板,如图4-12所示。

图4-12

使用Window | Move to Next Tab Group命令和Window | Move to Previous Tab Group命令,可以在选项卡组之间拖动选项卡,或者在选项卡组之间移动选项卡。右击一个选项卡,也可以从下拉菜单中选择这些选项。

要把用户界面还原为只有一个选项卡组,应把选项卡从新的选项卡组移回到最初的选项卡组,并删除平铺效果。

4.1.11 高级功能

要成为真正高效率的开发人员,知道代码编辑器中各种隐藏的高级功能将有助于节省大量时间。下面介绍代码编辑器中隐藏的一些最有效的命令。

1.注释/取消注释代码块

用户常需要注释/取消注释代码块,并且不希望在每行代码的开头添加/删除注释符号,尤其是在代码块中有许多行代码时。当然,在C#中可以把代码块包装在/*和*/中以注释,但不能在Visual Basic中使用这类注释。在C#中注释已包含注释的代码块时,使用这种方式也会出现问题。

Visual Studio提供了一种注释/取消注释代码块的简单方法:选择代码块,再选择Edit | Advanced | Comment Selection命令就可以注释,或者选择Edit | Advanced | Uncomment Selection命令可以取消注释。

访问这些命令的最简单方式(可能经常使用它们)是使用其快捷键。按下Ctrl+K、Ctrl+C快捷键可以注释一个代码块,按下Ctrl+K、Ctrl+U快捷键可以取消注释。Text Editor工具栏是访问这些命令的另一种简单方式。

2.块选择

块选择也称为框选择、列选择、矩形选择或垂直文本选择,它可以选择一个文本块(如图4-13所示),而不是像通常的行为那样选择文本行(流选择)。要选择文本块,可以在用鼠标选择文本的同时按住Alt键,或者使用键盘上的Shift + Alt + Arrow快捷键。例如,对齐代码后,希望删除该代码中的一个垂直部分(如变量声明中的前缀)时,就可以使用这个功能。

图4-13

3.多行编辑

多行编辑扩展了块选择的功能。使用块选择时,选择了一个垂直的文本块后,只能删除、剪切或复制该块,而使用多行编辑,就可以在选择了一个垂直的文本块后输入代码,替代所选的文本,如图4-14所示。例如,把一组变量从readonly更改为const时,该功能就很有用。

图4-14

还可以创建一个宽度为0的块,之后开始输入代码,把该块插入到多行代码上。

4.剪贴板循环

Visual Studio会跟踪复制或剪切到剪贴板上的最近20个代码段。要粘贴以前复制到剪贴板上的文本,应使用Ctrl + Shift + V快捷键,而不是普通的Ctrl + V快捷键。按住Ctrl + Shift快捷键的同时按下V键,会遍历剪贴板上的项。

5.全屏视图

选择View | Full Screen命令或使用Shift + Alt + Enter快捷键,可以最大化编辑代码的视图,这可以有效地最大化代码编辑器窗口,隐藏其他工具窗口和工具栏。要返回普通视图,可以再次按下Shift + Alt + Enter快捷键,或单击添加到菜单栏最后的Full-Screen切换按钮。

6.查找定义

为了快速导航到光标所指的类、方法或成员的定义,可以右击该对象并选择Go To Definition命令,或者按下F12键。

7.查找所有引用

要确定在哪里调用了某方法或属性,可以右击它的定义,再从下拉菜单中选择Find All References命令,或者把光标放在方法或属性的定义上,按下Shift + F12快捷键,这会激活Find Symbol Results工具窗口,显示解决方案中引用该方法或属性的所有位置。接着就可以双击结果窗口中的一个引用,把代码编辑器窗口导航到该引用上。

因为有了Navigate To功能和Call Hierarchy窗口(参见本章后面的内容),这个功能有点过时了。但它仍是一种快捷方式,用来确定在哪里使用了某方法,而不必浏览Call Hierarchy窗口。