
8.1 代码片段概述
Visual Studio 2015提供了全面的代码片段支持,不仅包含代码块,还可以预定义要插入文件的替代变量,便于定制插入的代码,以满足任务的需要。
8.1.1 在Toolbox中存储代码块
在介绍代码片段之前,本节先介绍Visual Studio把预定义的文本块插入文件的最简单方式。Toolbox可以包含要插入窗体的控件,也可以包含要插入文件的文本块(如代码)。要在Toolbox中添加代码块(或者其他文本),只需要在编辑器中选择它并拖放到Toolbox中,这会在Toolbox中创建一个相应的条目,它使用代码段的第一行作为名称。可以像处理Toolbox中的其他元素一样重命名、排列和分组这些条目。要插入代码片段,只要把它从Toolbox拖到文件中的合适位置即可(如图8-1所示)。另外双击Toolbox条目,也可以把它插入活动文件上光标所在的位置。

图8-1
很多演讲者使用这种简单的技术,在演讲中编码时快速插入大量的代码块。
这是Visual Studio 2015中使用代码片段的最简单方式,但因为过于简单,所以功能也有限,如无法共享和修改代码片段。尽管如此,在需要维护一系列短期使用的代码块时,这种保存小段代码的方法是有效的。
8.1.2 代码片段
代码片段是把代码块插入文件的更有效方式。代码片段在单独的XML文件中定义,这些文件包含程序员要插入代码的代码块,还可以包含可替换的参数,以便为当前的任务定制插入的代码片段。它们被集成到Visual Studio的IntelliSense中,查找起来非常方便,也很容易插入代码文件。
VB代码片段还可以添加程序集引用,并插入Imports语句。
Visual Studio 2015为两种主要的编程语言——Visual Basic和C#——提供了很多预定义的代码片段,还为JavaScript、HTML、XML、CSS、Testing、Office Development、C++和SQL Server提供了代码片段。这些片段以逻辑的方式组织为层次结构,以便找到需要的片段。除了定位Toolbox中的片段以外,也可以使用菜单命令或快捷键来打开代码片段列表。
除了预定义的代码片段外,还可以创建自己的代码片段,然后将它们存储到代码片段库中。由于每个片段都存储在一个特殊的XML文件中,因此可以与其他的开发人员共享。
插入代码片段的区域可以分为以下3类:
●Class Declaration:这种代码片段会生成一个完整的类。
●Member Declaration:这种代码片段包含了定义成员的代码,如方法、属性和事件处理程序例程,因此不能把它插入已有成员的外部。
●Member Body:这种片段被插入到已定义的成员中,如方法。
8.1.3 使用C#中的代码片段
Insert Snippet对话框是一种特殊的IntelliSense,它被内联到代码编辑器中。最初,它会显示Insert Snippet以及一个代码片段分组的下拉列表以供选择。选中需要的片段分组(使用上、下箭头键,再使用Tab键)后,就会显示一个片段列表,开发人员只要双击需要的代码片段即可,也可以在选中的片段上按下Tab或Enter键。
要在C#中插入代码片段,应确定所生成代码片段的插入位置,再展开Insert Snippet列表,最简单的方式是使用键盘快捷键Ctrl+K、Ctrl+X。还有两种方法可以启动代码片段的插入过程。第一种是在代码窗口中右击要插入的位置,然后从弹出的上下文菜单中选择Insert Snippet命令。另一种方法是使用菜单命令Edit | IntelliSense | Insert Snippet。
这样,Visual Studio就会展开Insert Snippet列表,如图8-2所示。滚动列表,并将鼠标指针停放在各个条目上,就会显示工具提示,说明此片段的功能以及调用该片段的快捷键。

图8-2
要对代码片段使用快捷键,只需要在代码编辑器中输入该快捷键(注意它显示在IntelliSense列表中),并按两次Tab键,在该位置插入代码片段。
图8-3显示了选择Automatically Implemented Property代码片段后的结果。为了帮助开发人员修改代码以满足自己的需要,需要改动的地方(替换变量)会突出显示,并且选中第一个要修改的地方。

图8-3
在改变所生成代码片段的变量部分时,Visual Studio 2015还会提供进一步的帮助。按下Tab键会移到下一个突出显示的值,此时可以用自己的值替换。按下Shift+Tab快捷键可以向后移动。这样,就可以很方便地访问需要改变的代码,而不需要手动选择要修改的内容。某些代码片段在代码片段逻辑的多个部分使用同一个变量,这就意味着改变一个地方的值将会改变所有其他实例的值。
完成后不再突出显示这些代码片段的变量时,可以继续编码,或者按下Enter键或Esc键。
8.1.4 Visual Basic中的代码片段
VB中的代码片段比C#中的代码片段有更多的可用功能,可以自动在项目中添加对程序集的引用,把代码需要的Imports语句插入文件中,以编译代码。
要使用代码片段,首先在程序代码清单中定位到要插入自动生成代码的位置,将光标置于此处。不需要考虑相关引用和Imports语句,它们会插入到正确的位置。接着像C#代码片段一样,可以使用下列方法之一打开Insert Snippet列表:
●使用键盘快捷键Ctrl+K、Ctrl+X。
●右击并从上下文菜单中选择Insert Snippet命令。
●运行菜单命令Edit | IntelliSense | Insert Snippet。
VB还有一种显示Insert Snippet列表的方式:仅输入?并按下Tab键。
现在浏览代码片段的层次结构,插入Draw a Pie Chart片段。图8-4演示了如何浏览代码片段的层次结构,找到该片段并插入到项目中。

图8-4
注意,图8-4中的工具提示文本包含了Shortcut:drawPie字样。这表明该代码片段有一个文本快捷方式,可以用来自动调用该代码片段,而不需要浏览代码片段的层次结构。与C#一样,只需要在代码编辑器中输入快捷方式并按下Tab键。在Visual Basic中,这种快捷方式是不区分大小写的,因此输入drawpie并按下Tab键也可以插入代码片段。注意在VB中,不在IntelliSense中显示快捷键,这与C#不同。
插入代码片段后,如果它包含替换变量,就可以输入它们的值,按下Tab键来遍历它们,这与C#一样。要在完成后不再突出显示这些片段变量时,可以继续编码,或者右击并选择Hide Snippet Highlighting命令。由于文件已经打开,因此如果希望突出显示插入的代码片段中的所有替换变量,可以右击并选择Show Snippet Highlighting命令。
8.1.5 用代码片段进行封装
C#和VB(通过CodeRush Xpress)都支持的一个操作是可以将已有的代码块包含在一个代码片段中。例如,要在条件try-catch块中包装一个已有的块,可以右击该代码块,并选择Surround With命令,或按下Ctrl+K、Ctrl+S快捷键,这会显示Surround With对话框,其中包含了可包装所选代码行的封装片段列表,如图8-5所示。

图8-5
选择try代码片段,生成如下代码:
VB
Public Sub MethodXYZ(ByVal name As String) Try MessageBox.Show(name) Catch ex As Exception Throw End Try End Sub
C#
public void MethodXYZ(string name) { try { MessageBox.Show(name); } catch (Exception) { throw; } }
8.1.6 Code Snippets Manager
Code Snippets Manager(代码片段管理器)是Visual Studio 2015管理代码片段的核心库。可以通过Tools | Code Snippet Manager菜单命令或者键盘快捷键Ctrl+K、Ctrl+B打开Code Snippets Manager。
首次打开Code Snippets Manager时,它会显示可用的HTML片段,但通过Language下拉列表可以改为显示当前使用的编程语言的代码片段。图8-6是编辑C#项目时显示的界面。默认情况下,分层文件夹的结构与PC上的文件夹相同,但当把不同位置的片段文件插入不同的分组时,新的代码片段会进入相应的文件夹中。

图8-6
如果需要将某个文件夹中的所有代码片段添加到库中,例如需要导入公司内部开发的所有代码片段,就可以单击Add按钮。在弹出的对话框中,选择需要添加的文件夹。以这种方式添加的文件夹会出现在树型视图的根部——和包含默认片段的主分组位于同一个层次。此外,还可以添加一个包含子文件夹的文件夹,子文件夹在树型视图中显示为子节点。
删除文件夹也非常简单——事实上也很危险。选中要删除的根节点,然后单击Remove按钮即可。选中的节点以及它所有的子节点和代码片段会立即从Code Snippets Manager中删除,连确认窗口都没有。如果不小心执行了这个操作,那么最好单击Cancel按钮,再次打开该对话框。尽管可以使用前面的方法重新添加删除的代码片段,但如果是无意删除,就很难确定到底删除了哪个默认的片段文件夹。
随Visual Studio 2015一起安装的代码片段位于安装文件夹的深处。在32位Windows上,VB代码片段库默认安装在%programfiles%\Microsoft Visual Studio 14.0\VB\Snippets\1033下,C#代码片段库默认安装在%programfiles%\Microsoft Visual Studio 14.0\VC#\Snippets\1033下(对于64位Windows,应使用%programfiles(x86)%替换%programfiles%)。使用Import按钮可以将单个代码片段文件导入库中。与Add按钮相比,这种方法的好处是可以为每个代码片段文件指定它在库结构中的位置。
8.1.7 创建代码片段
Visual Studio 2015没有提供代码片段创建器和编辑器。但Bill McCarthy的Snippet Editor允许创建、修改和管理代码片段(支持VB、C#、HTML、JavaScript和XML代码片段)。这个Snippet Editor是CodePlex上的一个开源项目。在其他MVP的帮助下,这个编辑器现在可以用于多种不同的语言。它可以从http://snippeteditor.codeplex.com下载。
通过手动编辑.snippet XML文件来创建代码片段是很麻烦的,还可能导致难以跟踪的错误,所以建议尽可能使用Snippet Editor。启动Snippet Editor时,左上角会显示一个下拉列表。如果从该列表中选择SnippetEditor.Product.Utility,则会显示包含所有已知片段的树状结构。展开某个节点,就可以看到类似于代码片段库中的一组文件夹。
8.1.8 查看已有的代码片段
Snippet Editor的一个卓越功能是为系统中所有片段文件的结构提供了视图。因此可以查看Visual Studio提供的默认代码片段,以学习如何更好地生成自己的代码片段。
定位到感兴趣的代码片段,双击相应的条目,就可以在Editor窗口中显示它。图8-7显示了一个简单的Display a Windows Form代码片段。有4个主窗格包含代码片段的所有相关信息。这些窗格自上而下如表8-1所示。
表8-1 代码片段的信息窗格


图8-7
浏览这些窗格,可以分析已有的代码片段,以了解它的属性和替换变量。在图8-7的例子中有一个替换区域,其ID为formName,默认值为Form。
为了说明使用Snippet Editor如何更容易地创建代码片段,下面创建一个代码片段,其中包括三个子例程(有一个是帮助子例程):
(1)启动Snippet Editor,创建一个新的代码片段。为此,在树状视图中选择一个目标文件夹,右击并从弹出的上下文菜单中选择Add New Snippet命令。
(2)显示提示时,将代码片段命名为Create A Button Sample,单击OK按钮。双击新条目,使其在Editor窗格中打开。
创建代码片段时,Editor不会自动打开新的片段——千万不要因此而错误地覆盖另一个代码片段的属性。
(3)首先要编辑Title、Description和Shortcut字段,如图8-8所示。
●Title:Create A Button Sample。
●Description:这个代码片段添加代码,以创建按钮控件,并给它关联一个事件处理程序。
●Shortcut:CreateAButton。

图8-8
(4)因为这个代码片段包含了成员定义,所以将Type设置为Member Declaration。
(5)在Editor窗口中,插入代码,以创建3个子例程。
VB
Private Sub CreateButtonHelper CreateAButton(controlName, controlText, Me) End Sub Private Sub CreateAButton(ByVal ButtonName As String, _ ByVal ButtonText As String, _ ByVal Owner As Form) Dim MyButton As New Button MyButton.Name = ButtonName MyButton.Text = ButtonName Owner.Controls.Add(MyButton) MyButton.Top = 0 MyButton.Left = 0 MyButton.Text = ButtonText MyButton.Visible = True AddHandler MyButton.Click, AddressOf ButtonClickHandler End Sub Private Sub ButtonClickHandler(ByVal sender As System.Object, _ ByVal e As System.EventArgs) MessageBox.Show("The " & sender.Name & " button was clicked") End Sub
C#
private void CreateButtonHelper() { CreateAButton(controlName, controlText, this); } private void CreateAButton(string ButtonName, string ButtonText, Form Owner) { Button MyButton = new Button(); MyButton.Name = ButtonName; MyButton.Text = ButtonName; Owner.Controls.Add(MyButton); MyButton.Top = 0; MyButton.Left = 0; MyButton.Text = ButtonText; MyButton.Visible = true; MyButton.Click += MyButton_Click; } private void MyButton_Click(object sender, EventArgs e) { MessageBox.Show("The " + sender.Name + " button was clicked"); }
(6)注意,这些代码与图8-8中的代码有些区别,因为controlName 没有突出显示。在图8-8中,这个参数是一个替换区域。为此,需要选择整个单词,右击并选择Add Replacement命令(或者在代码窗口下面的区域单击Add按钮)。
(7)修改替换属性,如下所示:
●ID:controlName。
●Defaults to:“ MyButton”。
●Tooltip:按钮的名称。
(8)对controlText重复这个过程:
●ID:controlText。
●Defaults to:“ Click Me!”。
●Tooltip:按钮的文本属性。
这样,代码片段就可以使用了。可以使用Visual Studio 2015将该代码片段插入到代码窗口中。
8.1.9 分布代码段
如果已经创建了许多代码片段,想与朋友和同事分享,最简单的方法就是发送.snippet文件,让它们使用Code Snippet Manager中的Import功能。然而,如果试图使这一过程更简单(或有不少朋友),就可以把代码片段打包到Visual Studio安装程序(.vsi)文件中,让它们自动安装到Visual Studio实例中。
下面的示例考虑以下代码片段,它放在SayHello.snippet文件中。
<?xml version="1.0" encoding="utf-8"?> <CodeSnippet Format="1.0.0" xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> <Header> <Title>Say Hello</Title> <Author>Bruce Johnson</Author> <Description>C# snippet for being polite...because I'm Canadian, after all</Description> <HelpUrl> </HelpUrl> <Shortcut>sayh</Shortcut> </Header> <Snippet> <Code Language="C#"> <![CDATA[Console.WriteLine("Hello World");]]> </Code> </Snippet> </CodeSnippet>
代码片段很容易使用.vsi文件来分发。.vsi文件的简单结构使这个过程非常简单。首先,文件本身只是一个.zip文件,只是扩展名改为.vsi。其次,在文件中有一个清单(其扩展名是.vscontent),它描述了.vsi文件的组件。
所以,要分发上面所示的代码片段,应创建一个文件SayHello.vscontent。该文件的内容(格式良好的XML)如下所示:
<VSContent xmlns="http://schemas.microsoft.com/developer/vscontent/2005"> <Content> <FileName>SayHello.snippet</FileName> <DisplayName>Polite C# Code</DisplayName> <Description>C# snippet for being polite </Description> <FileContentType>Code Snippet</FileContentType> <ContentVersion>2.0</ContentVersion> <Attributes> <Attribute name="lang" value="c#"/> </Attributes> </Content> </VSContent>
保存了代码片段后,把.vscontent和SayHello.snippet文件添加到.zip文件中。然后把该文件的扩展名.zip改为.vsi。该文件就准备好了,可以分发给朋友和同事;双击它,代码片段就安装到了Visual Studio中。