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;