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;