【編程技巧】Code snippets(代碼片段)在Visual Studio中的使用(附簡單的Snippet管理工具)

引言

Code snippet (代碼片段)在VS中指的是基於IDE支持的利用快捷方式快速輸入一小段,或者稱之爲一整塊代碼的功能,在日常編程,特別是在工作中寫內容相似的業務代碼時,利用Snippet功能,可以極大加快編程效率,我們先來看一個故事:

小張是一個IMIS軟件的程序員,每天的工作內容就是處理各種數據表,他最近在寫代碼的時候,發現經常有客戶需要在一個Remark字段中儲存一串多行的字符串,用其中的每一行的冒號之後的內容代表一個自定義的字段,比如,在這串字符串中得到姓名字段:

職業:程序員

姓名:張三

性別:男

爲此,他經常需要在不同的客戶的程序中寫同一個方法:

        /// <summary>
        /// 得到字符串特定行的第一個冒號(若有)之後的內容
        /// </summary>
        /// <param name="strSource">源字符串</param>
        /// <param name="intRow">指定的行數</param>
        /// <returns></returns>
        public static string GetSpecificRow(string strSource, int intRow)
        {
            string strResult = "";

            //用回車分割字符串
            string[] strFields = strSource.Split('\n');

            //只有目標行數不大於當前字符串行數且大於0才需要操作
            if (intRow >= 1 && strFields.Length >= intRow)
            {
                //用冒號拆分這一行的內容爲兩部分
                string[] strRow = strFields[intRow - 1].Split(new char[] { ':' }, 2);
                //若數組長度爲1,證明沒有冒號,直接返回這一行的內容,否則返回冒號之後的內容
                strResult = strRow.Length == 1 ? strRow[0] : strRow[1].TrimEnd();
            }

            return strResult;
        }

因爲寫的次數確實也有好幾次了,小張覺得每次遇到都寫一次這個方法,實在是太蠢了,雖然其實很多時候可以去找到上次寫過的,然後Copy過來,但是還是有點蠢,因爲每次都不得不去回憶在哪裏用到過,然後找到對應的代碼文件。

他轉念一想,可以放在公司的公用代碼庫(Code Library)裏作爲一個公用方法,就可以直接調用啦,可不成想,這個做法卻遭到了一個老同事的反對,同事這樣說:“不要整天你覺得有一個方法很常用就往庫裏面加,誰知道你寫的方法可不可靠,而且誰都像你這樣動不動就往裏面加東西的話,以後裏面方法一大堆,誰找得到。”

好吧,覺得有點道理,又覺得沒什麼道理,不過確實也是這樣,有時候你覺得好的東西,別人不一定覺得好,你覺得值得分享的東西,別人可能覺得沒價值。既然如此,只能再想想辦法啦。

忽然,小張想到,平時在寫for循環和定義屬性的時候,經常會這樣做:

 

在代碼中輸入for,IDE會提示有可用的代碼片段,雙擊Tab鍵就會出現屬於for循環的內置代碼片段:

            for (int i = 0; i < length; i++)
            {

            }

此時,光標會定位在"i"處,然後可以把"i"改成自己想要的局部變量名,再按Tab鍵,可以看到後面的兩個"i"都會隨之改變,之後光標會定位在"length"處,把"length"改成自己想要的數,按Enter鍵,可以看到光標定位在了for循環體中,可以開始寫循環體中的代碼了

 

如此方便的功能,能否自己DIY,創建一些屬於自己的代碼片段呢,小張搜索了MSDN文檔相關內容,發現結論是肯定的,甚至可以說這個功能就是爲DIY而生的,他總結了一些有價值的信息

 

 

代碼片段的存放位置及其內容

打開Visual Studio → 工具 → 代碼片段管理器 → 選擇編程語言

可以看到出現了一些文件夾供選擇,我們可以在這裏找到剛剛出現的那個for循環的代碼片段:

根據圖示文件夾,找到for.snippet文件,雙擊打開(會默認自動用VS打開,沒有的話可以用其它任意的文本編輯器打開),可以看到是一個XML結構的文本,也就是說,snippet實際上是以XML文件來儲存的,那麼現在問題就簡單了,爲了快速說明這個文件,我們爲其添加一些註釋

可以看到,一個Snippet文件大致分爲兩個部分:

<Header></Header>標籤之間的一些關於屬性的定義

Title 標題
Shortcut 在IDE中以何快捷鍵觸發
Description Snippet內容描述
Author 作者
SnippetType Snippet種類,是否允許插入在光標處,是否允許圍繞在選中代碼兩邊(選中一段代碼,按Ctrl+K,Ctrl+X,然後選中支持此屬性的Snippet,就能把這段代碼放在選中代碼的兩邊)等

 

 

 

 

 

 

 

<Snippet></Snippet>標籤之間的一些關於代碼片段內容的定義

Declarations Literal ID 需要被替換的字符串,如index,代表自定義代碼塊中的$index$需要被替換(以內置for循環的代碼片段舉例)
Default 代碼片段出現後這個字符串的默認值,比如i,用來替換$index$(以內置for循環的代碼片段舉例)
ToolTip 註釋,用於提示這個字符串代表什麼
Code Language 語言種類,如csharp,VB等
<![CDATA]]>

代碼塊正文,其中要被替換的關鍵字符串需要用兩個$(可以自定義,默認爲$)包裹,其中$selected$ 和$end$爲保留關鍵字,分別代表允許圍繞的代碼片段的選中代碼部分,以及代碼片段各部分調整完畢按回車之後,光標的停留位置

 

 

 

 

 

 

 

 

 

 

如何自定義並使用自己的代碼片段

打開Visual Studio → 工具 → 代碼片段管理器 → 選擇編程語言

可以看到VS爲我們內置了一個代碼片段文件夾,叫做My Code Snippets,我們只要自己創建一個snippet文件(複製內置的過來調整即可),然後在裏面寫上自己想要的內容,放進這個文件夾就行啦,比如前言中小張的需求,我們爲他編寫了一個snippet

因爲他的需求比較簡單,只是想要快速輸入方法,所以內容主要是方法體本身,沒有$包含的字符串,我們把這個文件存進剛剛說的My Code Snippets文件夾,可以看到,不需要重啓VS,打開代碼片段管理器,這裏已經出現了我們自定義的代碼片段

試着使用看看,在IDE中輸入快捷方式"gsr",可以看到一整個方法體直接出現了,小張終於可以解放雙手了,他接下來有了新的想法,把Snippet分類,做一個屬於自己的代碼片段庫,裏面包含各種自己常用的代碼片段,這樣不但可以方便查找常用的方法,不用去仔細回憶,尋找各種文件,還能作爲自己的一個知識儲備庫,想到這裏,他笑開了花

後記:

合理使用代碼片段確實能給我們的編程提高不少效率,但是編寫代碼片段本身也是一個有點消耗時間的過程,筆者爲了進一步解放雙手,用Winform開發了一個簡單的小工具用於快速編寫和儲存Snippet,大家可以隨意取用,代碼在https://github.com/GadHao/SnippetManager

晚安啦各位!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章