1、Code Snippet(代码片段)功能介绍
平常我们在使用Visual Studio 进行开发时,可以看到Intellisense提示如下内容
这种就是代码片段的提示。如输入cw 后,按两次Tab 键,即可输入Console.WriteLine();
代码片段是小块可重用代码,可通过右键单击菜单(关联菜单)命令或热键组合插入到代码文件中。
2、Visual Studio 中预置的代码片段(C#)
|-----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------|
| 代码片段 | 功能 | 可用位置 |
| #if | 创建 #if 指令和 #endif 指令。 | 任何位置。 |
| #region | 创建 #region 指令和 #endregion 指令。 | 任何位置。 |
| ~ | 创建包含类的终结期(析构函数)。 | 在类中。 |
| attribute | 为派生自 Attribute 的类创建声明。 | 在命名空间(包括全局命名空间)、类或结构中。 |
| checked | 创建 checked 块。 | 在方法、索引器、属性访问器或事件访问器内。 |
| class | 创建类声明。 | 在命名空间(包括全局命名空间)、类或结构中。 |
| ctor | 创建包含类的构造函数。 | 在类中。 |
| cw | 创建对 WriteLine 的调用。 | 在方法、索引器、属性访问器或事件访问器内。 |
| do | 创建 do while
循环。 | 在方法、索引器、属性访问器或事件访问器内。 |
| else | 创建 else 块。 | 在方法、索引器、属性访问器或事件访问器内。 |
| enum | 创建枚举声明。 | 在命名空间(包括全局命名空间)、类或结构中。 |
| equal | 创建一个方法声明,该声明对 Object 类中定义的 Equals 方法进行重写。 | 在类或结构中。 |
| exception | 为某个从异常(默认情况下为 Exception)派生的类创建声明。 | 在命名空间(包括全局命名空间)、类或结构中。 |
| for | 创建 for 循环。 | 在方法、索引器、属性访问器或事件访问器内。 |
| foreach | 创建 foreach 循环。 | 在方法、索引器、属性访问器或事件访问器内。 |
| forr | 创建 for 循环,每次迭代后会减少循环变量。 | 在方法、索引器、属性访问器或事件访问器内。 |
| if | 创建 if 块。 | 在方法、索引器、属性访问器或事件访问器内。 |
| indexer | 创建索引器声明。 | 在类或结构中。 |
| interface | 创建接口声明。 | 在命名空间(包括全局命名空间)、类或结构中。 |
| invoke | 创建安全调用事件的块。 | 在方法、索引器、属性访问器或事件访问器内。 |
| iterator | 创建迭代器。 | 在类或结构中。 |
| iterindex | 使用嵌套类创建"已命名"迭代器和索引器对。 | 在类或结构中。 |
| lock | 创建 lock 块。 | 在方法、索引器、属性访问器或事件访问器内。 |
| mbox | 创建对 System.Windows.Forms.MessageBox.Show 的调用。 可能还需要添加对 System.Windows.Forms.dll 的引用 。 | 在方法、索引器、属性访问器或事件访问器内。 |
| namespace | 创建命名空间声明。 | 在命名空间(包括全局命名空间)中。 |
| prop | 创建自动实现的属性声明。 | 在类或结构中。 |
| propfull | 创建具有 get
和 set
访问器的属性声明。 | 在类或结构中。 |
| propg | 创建具有专用 set
访问器的只读自动实现的属性。 | 在类或结构中。 |
| sim | 创建 static int Main 方法声明。 | 在类或结构中。 |
| struct | 创建结构声明。 | 在命名空间(包括全局命名空间)、类或结构中。 |
| svm | 创建 static void Main 方法声明。 | 在类或结构中。 |
| switch | 创建 switch 块。 | 在方法、索引器、属性访问器或事件访问器内。 |
| try | 创建 try-catch 块。 | 在方法、索引器、属性访问器或事件访问器内。 |
| tryf | 创建 try-finally 块。 | 在方法、索引器、属性访问器或事件访问器内。 |
| unchecked | 创建 unchecked 块。 | 在方法、索引器、属性访问器或事件访问器内。 |
| unsafe | 创建 unsafe 块。 | 在方法、索引器、属性访问器或事件访问器内。 |
| using | 创建 using 指令。 | 在命名空间(包括全局命名空间)中。 |
| while | 创建 while 循环。 | 在方法、索引器、属性访问器或事件访问器内。 |
3、创建代码片段
创建代码片段的基本格式如下:
1 <?xml version="1.0" encoding="utf-8"?>
2 <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
3 <CodeSnippet Format="1.0.0">
4 <Header>
5 <Title></Title>
6 <Shortcut></Shortcut>
7 <Description></Description>
8 <Author></Author>
9 </Header>
10 <Snippet>
11 <Code Language="">
12 <![CDATA[]]>
13 </Code>
14 </Snippet>
15 </CodeSnippet>
16 </CodeSnippets>
这里我们创建一个输入当前时间的代码片段,简写为 dt
使用Visual Studio 创建一个XML文档,内容如下:
1 <?xml version="1.0" encoding="utf-8"?>
2 <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
3 <CodeSnippet Format="1.0.0">
4 <Header>
5 <Title>dt</Title>
6 <Shortcut>dt</Shortcut>
7 <Description>DateTime.Now的代码片段</Description>
8 <Author>zhaotianff</Author>
9 </Header>
10 <Snippet>
11 <Declarations>
12 <Literal>
13 <ID>expression</ID>
14 <ToolTip>日期类型</ToolTip>
15 <Function>SimpleTypeName(global::System.DateTime)</Function>
16 </Literal>
17 <Literal>
18 <ID>dt</ID>
19 <ToolTip>变量名</ToolTip>
20 <Default>dt</Default>
21 </Literal>
22 </Declarations>
23 <Code Language="csharp"><![CDATA[var $dt$ = $expression$.Now;$end$]]>
24 </Code>
25 </Snippet>
26 </CodeSnippet>
27 </CodeSnippets>
格式说明:
**Header:**用于指定有关 IntelliSense 代码段的常规信息
Title:代码段的友好名称
Shortcut :快捷输入文本,这里用的是 dt
Description:描述。这会显示在Visual Studio的提示上,在后面的截图可以看到
Author:作者
Snippet :指定代码片段的引用、导入、声明以及代码内容
**Declarations:**声明字面量或对象
**Literal:**定义可以编辑的代码段的文本(字面量)
ID :指定字面量的唯一标识符(这个元素是必需的)
Default :指定插入代码段时字面量的默认值(这个元素是必需的)
Function :元素 指定当文本在 Visual Studio 中获得焦点时要执行的函数
ToolTip :元素 用于描述文本的预期值和用法
最关键的就是Code元素,在这里定义代码片段中的代码内容。
Code 元素有两个保留的关键字:end 和**selected**。
end 标记在插入代码段之后用于放置光标的位置。
selected 表示在文档中选择的要在调用时插入代码段的文本(如果定义了字面量,会直接选择字面量,当按下回车后,会跳到**selected**的位置)
Code元素支持三种属性
Language:用于标识当前的代码片段用于哪种编程语言,可选项(VB、CSharp、CPP、XAML、XML、JavaScrip、TypeScript、SQL、HTML)(这个选项是必需的)
Kind:用于标识 代码片段可以用于哪个位置。(这个属性是可选的)
method body (用于方法内部)、method decl (用于方法定义)、type decl (用于类型定义)、file (完整的代码定义,可用于任何位置)、any(任何位置)
$:分隔符,可以描述字面量或对象
示例代码说明
在示例代码中定义了两个字面量
1 <Literal>
2 <ID>expression</ID>
3 <ToolTip>日期类型</ToolTip>
4 <Function>SimpleTypeName(global::System.DateTime)</Function>
5 </Literal>
6 <Literal>
7 <ID>dt</ID>
8 <ToolTip>变量名</ToolTip>
9 <Default>dt</Default>
10 </Literal>
第一个使用了Function元素,代表这里会执行System.DateTime
第二个是一个可选输入,使用了Default元素来标识默认值
1 <Code Language="csharp"><![CDATA[var $dt$ = $expression$.Now;$end$]]>
在Code 元素中,指定语言为CSharp ,在<![CDATA[...]]>中输入代码片段 var dt = expression.Now;end
**dt**是前面定义的字面量,按下Tab键后,会自动选中该值
**expression**是前面定义的字面量,代表System.DateTime
**end**代表代码片段结束后,光标所在的位置
这里我们再对照VS内置的if代码片段来进行说明,定义如下:
1 <?xml version="1.0" encoding="utf-8"?>
2 <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
3 <CodeSnippet Format="1.0.0">
4 <Header>
5 <Title>if</Title>
6 <Shortcut>if</Shortcut>
7 <Description>if 语句的代码片段</Description>
8 <Author>Microsoft Corporation</Author>
9 <SnippetTypes>
10 <SnippetType>Expansion</SnippetType>
11 <SnippetType>SurroundsWith</SnippetType>
12 </SnippetTypes>
13 </Header>
14 <Snippet>
15 <Declarations>
16 <Literal>
17 <ID>expression</ID>
18 <ToolTip>要计算的表达式</ToolTip>
19 <Default>true</Default>
20 </Literal>
21 </Declarations>
22 <Code Language="csharp"><![CDATA[if ($expression$)
23 {
24 $selected$ $end$
25 }]]>
26 </Code>
27 </Snippet>
28 </CodeSnippet>
29 </CodeSnippets>
当输入if代码片段后,可以看到如下:
定义的字面量**expression** 会被选中,修改后,按下回车,会跳到**selected**的位置。
这里还有一个元素,在上面的介绍中没有涉及到。
那就是Header 元素下的SnippetType元素,该元素用于指定 Visual Studio 如何插入代码段。如果未指定,刚代表可以在任何位置插入。
SnippetType元素可以重复使用。可选值如下:
**SurroundsWith
:**允许将代码段放置在一段选定的代码周围。
**Expansion
:**允许将代码段插入到光标处。
Refactoring
: 指定在C# 重构过程中使用代码片段。 不能在自定义代码段中使用 Refactoring
。
4、管理代码片段
在工具菜单下,选择【代码片段管理器】项,可以打开代码片段管理器。
在这里可以管理已有的代码片段,也可以添加新的代码片段。
保存上面示例代码为dt.snippet文件
打开代码片段管理,点击添加,选择刚刚保存的dt.snippet文件
由于使用了 Language="csharp" 来标识 ,所以会自动放到CSharp类别下,并且会自动钩选 【My Code Snippets】文件夹。
5、使用导入的代码片段
输入 dt ,可以看到Visual Studio的提示。
按两下Tab键,即可以快速输入
1 var dt = DateTime.Now;