內容概要:
- 什么是Code Snippet?它能為我們帶來什么?
- 如何使用Code Snippet?
- 分析Code Snippet文件【.snippet】
- 編寫一個實現屬性更改通知的Code Snippet
什么是Code Snippet?它能為我們帶來什么?
Code Snippet是預編寫的代碼片段,您可以隨時使用 Visual Studio 將這些代碼片段插入到您的應用程序中。這些代碼段減少了鍵入重復代碼或搜索示例所用的時間,從而提高了工作效率。可以使用代碼段 XML 架構創建自己的 Visual Basic、Visual C# 或 XML 代碼段,並將它們添加到 Visual Studio 已包含的代碼段中。【來自MSDN】
如何使用Code Snippet?
- 首先 ,新建一個控制台應用程序“CodeSnippetExample”
- 在Program類內部,Main方法外部敲入“prop”(property,“屬性”的縮寫)
- 在輸入完“prop”后,按下“tab”鍵,你就會發現代碼變成了這個樣子:
其中,淺藍色背景標識着我們正在修改的代碼,可以通過按“tab”鍵來更改修改光標,如果這時按下“tab”鍵,代碼就會變成下面的樣子,這樣就可以修改“MyProperty”了。 - 現在,我們將屬性的類型修改為“String”,屬性名改為“NewProperty”。
- 然后,鍵入回車鍵,退出代碼段模式,這樣,一個簡寫的屬性就完成了。
這個只是一個簡單的例子,同樣的,你還可以使用propfull來實現具有字段的屬性,比如下面的:
到現在,可以很明顯的看出,如果我們能很好的利用CodeSnippet的話,編寫代碼的速度將會有很大的提升,比如,我會使用CodeSnippet來幫我編寫通知屬性,從而少去了大量手工代碼的編寫:
在VS中內置了很多現成的CodeSnippet模板,可以通過VS-工具-代碼段管理器來查看這些CodeSnippet。
分析Code Snippet文件【.snippet】
在代碼段管理器中,把“語言”選項調整為“Visual C#”,展開下面的Visual C#節點,就會看到下面的東西:
下面,把“位置”下面的地址復制到“資源管理器”的地址欄,按回車,並且找到“prop.snippet”,雙擊它,默認會被VS打開,下面給出代碼:
<CodeSnippet Format="1.0.0">
<Header>
<Title>prop</Title>
<Shortcut>prop</Shortcut>
<Description>自動實現的屬性的代碼段
語言版本: C# 3.0 或更高版本</Description>
<Author>Microsoft Corporation</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>type</ID>
<ToolTip>屬性類型</ToolTip>
<Default>int</Default>
</Literal>
<Literal>
<ID>property</ID>
<ToolTip>屬性名</ToolTip>
<Default>MyProperty</Default>
</Literal>
</Declarations>
<Code Language="csharp"><![CDATA[public $type$ $property$ { get; set; }$end$]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
很明顯的,這是一個XML格式的文件,其根節點CodeSnippets下有一個CodeSnippet節點,代表一個CodeSnippet代碼段。在CodeSnippet節點下面,有兩個節點,Header和Snippet。
先分析Header。在Header下有下面幾個標簽:Title,Shortcut,Description,Author,SnippetTypes。前4個標簽都很好理解,分別是:標題,快捷命令,描述,作者。難理解的是最后一個:SnippetTypes。
SnippetTypes,指定 Visual Studio 如何將代碼段插入到代碼中。SnippetTypes 元素中可能有零個或多個 SnippetType 元素。 <?XML:NAMESPACE PREFIX = [default] http://msdn2.microsoft.com/mtps NS = "http://msdn2.microsoft.com/mtps" /?> 如果 SnippetTypes 元素不存在,則代碼段可以插入到代碼中的任何位置。 其子節點只能為SnippetType,且SnippetType只能有兩種值:SurroundsWith(允許將此代碼段放置在一段選定的代碼周圍)、Expansion(允許將代碼段插入到光標處。 )。這個不是很理解。。。
下面,開始分析Snippet。在Snippet下面有兩個標簽Declarations(聲明),Code。
Declarations:指定構成代碼段可編輯部分的文本和對象。
在Declarations標簽內部的Literal定義代碼段的可編輯文本。Literal元素用於標識完全包含在代碼段中的代碼片段替換,不過這些代碼片段在插入到代碼中后,可能需要進行自定義。 例如,字符串、數值和一些變量名都應聲明為文本。(這個是MSDN中的解釋,說白了就是定義我們在使用CodeSnippet時可以編輯的幾個部分,想象成模板替換符也可以)
在Literal標簽下,有三個標簽,ID(必選的,用於模板替換時的標識符),ToolTip(可選的,提示文本),Default(必選的,指定插入代碼段時文本的默認值。也就是模板替換符的默認值)。
結束了”定義部分“,我們就要組織模板了。開始分析Code標簽。
Code標簽中的內容很簡單,使用XML屬性標識了使用的語言是csharp,其內部的數據標簽,就是一個代碼模板,這里便用上了上面定義的Declarations,用法很簡單,在ID前后加$符號就可以。
【PS】分析的不好,大家見諒。。。
編寫一個實現屬性更改通知的Code Snippet
在WPF程序中,有很多程序員樂於使用MVVM模式,於是,在寫ViewMode時,編寫具體有通知功能的屬性就成了這部分程序員必須做的事情,他們寫出的代碼大概就是這樣:
public class ViewModel : NotificationObject
{
private String userName;
public String UserName
{
get { return userName; }
set { userName = value; this.RaisePropertyChanged("UserName"); }
}
}
仔細觀察,發現這段代碼中聲明UserName屬性的代碼,其代碼和使用propfull生成的代碼很相似,只不過是在set訪問器中多了一句this.RaisePropertyChanged("UserName"); 而已。現在,開始讓代碼簡化起來。。。
首先,找到propfull的CodeSnippet文件,復制到桌面。:C:\Program Files\Microsoft Visual Studio 10.0\VC#\Snippets\2052\Visual C#\propfull.snippet
修改Title,Shortcut,Description。。。。propNotification,propno,具有通知功能的屬性。
接着,在Code標簽中找到set訪問器的代碼,在其原有語句的分號后面加上這句話:“this.RaisePropertyChanged("$property$");”。
這樣,一個實現通知同能屬性的CodeSnippet就寫好了。然后把這個文件保存,重命名為propn.snippet 復制到C:\Program Files\Microsoft Visual Studio 10.0\VC#\Snippets\2052\Visual C#\目錄,重啟VS,試試看,是不是成功了?