Visual Studio 中的Code Snippet(代码片段)功能介绍

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 | 创建具有 getset 访问器的属性声明。 | 在类或结构中。 |
| 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;
相关推荐
小码编匠6 小时前
一款 C# 编写的神经网络计算图框架
后端·神经网络·c#
小灰灰__6 小时前
IDEA加载通义灵码插件及使用指南
java·ide·intellij-idea
Mortal_hhh7 小时前
VScode的C/C++点击转到定义,不是跳转定义而是跳转声明怎么办?(内附详细做法)
ide·vscode·stm32·编辑器
无极程序员8 小时前
PHP常量
android·ide·android studio
Envyᥫᩣ9 小时前
C#语言:从入门到精通
开发语言·c#
小黄人软件10 小时前
android浏览器源码 可输入地址或关键词搜索 android studio 2024 可开发可改地址
android·ide·android studio
叶知安14 小时前
如何用pycharm连接sagemath?
ide·python·pycharm
IT技术分享社区15 小时前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法