代码片断是VS中非常重要的功能,我们时刻无意的总在使用。比如:tryf (tab键),自动生成如下代码:

        try
        {               
        }
        finally
        {
        }

这样的快捷方式非常多,默认我们可以在 C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC#\Snippets\1033\Visual C# 找到很多VS自带的代码片断。

使用方式

在VS中,可以使用 ctrl+b,ctrl+k 打开 Code Snippets Manager,这里除了系统以外,我们还可以自定义导入属于自己的片断。

在大部分项目中,极大部分页面几乎都是重复性结构,所以我们可以针对不同项目做一些代码片断,这无疑对提高开发效率非常有帮助,而且还可以让代码风格更舒服。

实则每个片断都是独立一个XML文件存储,并以 *.snippet 为后缀,导入VS中,就可以直接在代码中使用。

单例模式的代码片断

以下是我常用单例模式的代码片断,我尽可能直接在XML文件中声明相当元素的说明。

<?xml version="1.0" encoding="utf-8"?>
<!--xmlns:可以修改2013为2005、2008等根据不同VS版本来选择。-->
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2013/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>单例模式</Title>
      <Description>创建一个完整的单例模式。</Description>
      <Author></Author>
      <HelpUrl></HelpUrl>
      <!--插入代码段的方式,分别:SurroundsWith:一段代码、Expansion:光标处、Refactoring-->
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
      <!--用于VS使用,用于搜索片断代码。-->
      <Keywords>
        <Keyword>Create Singleton</Keyword>
        <Keyword>Singleton Create</Keyword>
      </Keywords>
      <!--插入代码片断的快捷方式,只能包含字母数字字符、连字符 (-) 和下划线 (_)。-->
      <Shortcut>context</Shortcut>
    </Header>
    <Snippet>
      <!--引用分组,有关代码段所需的程序集引用的信息。-->
      <References>
        <Reference>
          <Assembly>System.Web.Mvc.dll</Assembly>
        </Reference>
      </References>
      <!--指定 IntelliSense 代码片段使用的导入的命名空间。-->
      <Imports>
        <Import>
          <Namespace>System.Web.Mvc</Namespace>
        </Import>
      </Imports>
      <!--代码片段组成部分的文本和对象,分为Object和Literal两种,结构差不多一样,Object多一个Type-->
      <Declarations>
        <!--Editable:是否可编辑-->
        <Object Editable="true">
          <!--文本唯一标识符,除了$end$保留值;用于插入代码后光标位置。-->
          <ID>class_name</ID>
          <!--指定对象类型-->
          <Type />
          <ToolTip>类名</ToolTip>
          <Default>class_name</Default>
          <!--指当VS收到焦点时要执行的函数,见后面的详细。-->
          <Function>ClassName()</Function>
        </Object>
        <Literal Editable="true">
          <ID>instance_class</ID>
          <ToolTip />
          <Default>instance_class</Default>
          <Function />
        </Literal>
      </Declarations>
      <!--代码容器,Kind指定代码类型,包括:method body、method decl、type decl、file 和 any,Delimiter:代码中文本或对象的分隔符。-->
      <Code Language="csharp" Kind="" Delimiter="$">
        <![CDATA[private static readonly object _locker = new object();
private static $instance_class$ instance;
private $class_name$() { }
public static $instance_class$ Instance
{
    get 
    {
        if (instance == null) 
        {
            lock (_locker) 
            {
                if (instance == null)
                {
                    instance = new $instance_class$();
                }
            }
        }
        return instance;
    }
}]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

关于Function元素

MSDN中解释:

此文本指定当文本或对象字段在 Visual Studio 中获得焦点时要执行的函数。

目前只有三个函数,分别是:

  1. GenerateSwitchCases( EnumerationLiteral ) 用于生成 switch 语句和一组 switch,这里的 EnumerationLiteral 等同Object和Literal的唯一标识符。
    2.ClassName() 返回当前所在类的类名。
    3.SimpleTypeName( TypeName ) 缩减代码容器的类型名称。

编辑Snippet工具

Snippet Editor 一个开源编辑Snippet工具,大大简化编写XML错误率,已经有完整的文档,不再赘述。

附录

以上。