使用Code Snippet簡化Coding 在開發的項目的時候,你是否經常遇到需要重復編寫一些類似的代碼,比如是否經常會使用 for、foreach ? 在編寫這兩個循環語句的時候,你是一個字符一個字符敲還是使用 Visual Studio 提供的Code Snippet 工具自動幫你生成呢?
神奇之處
你只需要在代碼編輯器中輸入for,就會看到 Visual Studio 的自動提示框中出現了如下紅框框起來的部分,這個時候只需要連按兩下 tab 鍵,便會自動補全 for 循環語句(如圖2所示),並且默認選中索引,以便你進行修改。
圖 1 自動提示框
圖 2 自動補全循環語句
是不是很神奇? 與之類似的還有switch、cw (Console.WriteLine)、ctor(構造器)、prop(屬性)等,靈活運用這些就可以讓你的 Coding 工作事半功倍,更多默認 CodeSnippet 請查看參考資源[1]。
但是,每個項目都有每個項目的特殊性,默認的這些 Code Snippet 如果無法滿足您的需求,這個時候就需要自動動手來擴展了。
Code Snippet 的神秘面紗【C#】
在動手開始寫自己的 Code Snippet 之前,得先搞清楚這個玩意兒是怎麼做到的。
它其實只是一個 xml,只不過包含了一些只有 Visual Studio 才認識的元素,這些元素就定義了如何去替我們補全代碼(,Code Snippet 針對不同的語言如VB、C#、CSS使用不同的元素,本文全部按照 C# 語言進行介紹)。
attribute.Snippet 文件源碼 :C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC#\Snippets\2052\Visual C#
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>attribute</Title>
<Shortcut>Attribute</Shortcut>
<Description>使用建議模式的特性的代碼片段</Description>
<Author>Microsoft Corporation</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>name</ID>
<ToolTip>特性的名稱</ToolTip>
<Default>My</Default>
</Literal>
<Literal>
<ID>target</ID>
<Default>All</Default>
</Literal>
<Literal>
<ID>inherited</ID>
<Default>false</Default>
</Literal>
<Literal>
<ID>allowmultiple</ID>
<Default>true</Default>
</Literal>
<Literal Editable="false">
<ID>SystemAttribute</ID>
<Function>SimpleTypeName(global::System.Attribute)</Function>
</Literal>
<Literal Editable="false">
<ID>SystemAttributeUsage</ID>
<Function>SimpleTypeName(global::System.AttributeUsage)</Function>
</Literal>
<Literal Editable="false">
<ID>SystemAttributeTargets</ID>
<Function>SimpleTypeName(global::System.AttributeTargets)</Function>
</Literal>
<Literal Editable="false">
<ID>Exception</ID>
<Function>SimpleTypeName(global::System.NotImplementedException)</Function>
</Literal>
</Declarations>
<Code Language="csharp"><![CDATA[[$SystemAttributeUsage$($SystemAttributeTargets$.$target$, Inherited = $inherited$, AllowMultiple = $allowmultiple$)]
sealed class $name$Attribute : $SystemAttribute$
{
// See the attribute guidelines at
// http://go.microsoft.com/fwlink/?LinkId=85236
readonly string positionalString;
// This is a positional argument
public $name$Attribute (string positionalString)
{
this.positionalString = positionalString;
// TODO: Implement code here
$end$throw new $Exception$();
}
public string PositionalString
{
get { return positionalString; }
}
// This is a named argument
public int NamedInt { get; set; }
}]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
待續。。。