日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

运用代码管理段来提升开发效率

發布時間:2024/1/17 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 运用代码管理段来提升开发效率 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言?
在談談VS中的模板中,我介紹了如何創建項目/項模板,這種方式可以在創建項目時省卻不少重復性的工作,從而提高開發效率。在創建好了項目和文件后,就得開始具體的編碼了,這時又有了新的重復性工作,就是需要經常編寫一些類似或者說雷同的代碼,我們需要一種方法將這些代碼管理起來,減少重復輸入。
一個常見的例子,在使用for語句結構時,可能會有這樣的代碼:

int[]?array?=?{?1,?2,?3,?4,?5?}; for?(int?i?=?0;?i?<?array.Length;?i++) { ????Console.WriteLine(array[i]); }

或者

List<string>?names?=?new?List<string>?{?"Anders",?"Bill",?"Clark",?"David"}; for?(int?i?=?0;?i?<?names.Count;?i++) { ????if?(names[i].StartsWith("A")) ????{ ????????Console.WriteLine(names[i]); ????} }

顯然,這兩個for循環的代碼很相似:輸入for,選擇一個變量用作索引,該變量有個上限值,還有幾個括號和分號。而且絕大多數的for循環都是如此,那么該如何減少重復輸入呢? 可以想到的一種方法是把一段for循環的代碼保存在某個地方,比如一個文件內,在需要for的地方,拷貝進來,把變量名、初始值、上限修改一下就可以用了。
VS的開發者想的很周全,提供了Code Snippet功能,從而實現了上面的想法。它保存了for循環代碼的模板,然后給它一個快捷鍵for。現在在編輯器中(需要是C#文件),輸入for,連續按兩下Tab鍵,就會出現下面的代碼: ?
不僅有了for的基本代碼,還定位到了變量的名字處,如果需要可以修改變量名,假設改為index,后面的兩個i會自動改為index,然后按Tab,光標會跳至下一個深色顯示的地方,即length,這里可以修改index的上限,然后回車,光標會跳至for循環的代碼體:?
是不是很方便呢?還有很多其它Snippet,比如輸入cw,按兩下Tab就出來Console.WriteLine()。
很多時候,同樣的功能在不同語言內的表現是不同的,所以Code Snippet(以下簡稱Snippet)是特定于語言的,也就是說C#的Snippet不能用于VB.NET。VS2008中的Snippet支持C#、VB.NET、XML。
Snippet的管理?
首先VS2008提供了很多內置的Snippet,另外我們也可以將自己編寫的或者他人編寫的導入VS中。通過菜單Tools -> Code Snippets Manager(或按Ctrl+K, Ctrl+B),打開Code Snippets Manager窗口: ?
可以看到上面的Language列表,現在選中的是C#。可以通過Import方式來導入新的Snippet。在使用NUnit時,由于測試代碼的特點,會有很多重復輸入,所以Scott Bellware提供了NUnit的Snippet,我把它放在自己的博客來了:BellwareNUnitSnippet。現在把包里的.snippet文件導入。 ?
嗯,可以使用了。比如,輸入tc,按兩下Tab,出來的代碼是這樣的: ?
輸入TestCase的名稱,回車,這樣就可以輸入測試代碼了。觀察一下這個Snippet,它的變化之處只有一個,就是TestCase處。
接下來我們來分析一下Snippet文件的結構,這樣才能編寫自己的Snippet。
Snippet定義文件解析?
下面來看看Snippet是如何實現的。根據上面tc的例子,我們可以猜想要存放Snippet,至少需要模板代碼、占位符、語言類型、快捷鍵這幾個關鍵信息,每個Snippet都是如此。事實上,VS把這些信息保存在XML文件中,這些信息都對應著某些節點,這個與上一篇里的模板清單文件類似。
存放Snippet的文件是XML文件,不過它的擴展名是.snippet。一個Snippet文件可以包含多個Snippet,就像上面的BellwareNUnit.snippet那樣。它的基本結構如下:

XML Code <?xml?version="1.0"?encoding="utf-8"??><CodeSnippets?xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> ????<CodeSnippet?Format="1.0.0"> ????????<Header> ????????????<Title>Code?Snippet?for?Debug.WriteLine?method.</Title> ????????????<Shortcut>dw</Shortcut> ????????????<Author>Anders?Cui</Author> ????????</Header> ????????<Snippet> ????????????<Code?Language="CSharp"> ????????????????<![CDATA[ ????????????????Debug.WriteLine(“Text”); ????????????????]]> ????????????</Code> ????????</Snippet> ????</CodeSnippet> ????<!--?other?snippets?--></CodeSnippets>

現在新建一個XML文件,輸入上面的代碼,這里我們的Snippet是輸入Debug.WriteLine代碼。該文件的根節點為CodeSnippets,可以包含多個<CodeSnippet>節點。注意它的命名空間,有了這個,在VS內編輯時就方便多了。
重點關注<CodeSnippet>節點,它即表示一條Snippet。它必須包含一個Format Attribute(老是看到Attribute和Property的討論,故在此保留),用以表示Snippet版本。另外它必須包含兩個子節點:<Header><Snippet>
對于<Header>節點,最重要的是Title和Shortcut,即Snippet的名稱和快捷鍵;另外還有SnippetTypes,它可以包含若干個SnippetType節點,可有三種取值,Expansion、SurroundsWith、Refactoring。Expansion允許代碼插入在光標處;SurroundsWith允許代碼圍繞在選中代碼兩邊(就像#region那樣);Refactoring指定了在C#重構過程中所使用的Snippet,在自定義Snippet中不能使用。如果該值不做設置,則Snippet可以放在任何地方。
要了解<Header>的更多信息,請參看這里。
對于<Snippet>節點,它是實現代碼模板的地方。它包含四個子節點。
1、?<Code>節點

  • Delimiter:分隔符,默認值為$,后面你會看到它的用法。
  • Kind:Snippet的類型,比如方法體、方法聲明、類型聲明等。
  • Language:所適用的語言類型,如C#、VB.NET、XML。

在我們上面的例子中,已經有了Code節點了,注意這里把代碼包含在<![CDATA[]]>中,因為代碼很可能會包含一些特殊字符。
在上面的tc Snippet中,按下Tab后,VS會選中TestCase,這樣修改起來更為方便,對于上面的dw Snippet,我們自然希望VS選中”Text”部分,這需要下面的<Declarations>節點。
2、<Declarations>節點?
該節點包含若干個<Literal>和<Object>節點。它們可以看作是占位符。<Literal>用于指定一些文本值,<Object>則用于聲明模板中的對象。 詳細信息請參看<Literal>和<Object>。
這里需要把”Text”看作占位符,所以添加一個<Literal>節點:

XML Code ????<Snippet> ????????<Code?Language="CSharp"> ????????????<![CDATA[ ????????????Debug.WriteLine($text$);$end$ ????????????]]> ????????</Code> ????????<Declarations> ????????????<Literal> ????????????????<ID>text</ID> ????????????????<ToolTip>Text?to?write</ToolTip> ????????????????<Default>"Text"</Default> ????????????</Literal> ????????</Declarations> ????</Snippet>

這里添加了一個占位符$text$,默認值為”Text”,行末的$end$是一個特殊的占位符,它表示當你按下回車后光標的位置
3.?<Imports>節點?
用于指定使用Snippet時應當向文件內添加的命名空間引用,不過只支持VB.NET。
4.?<References>節點?
用于指定使用Snippet時應當向添加的程序集引用,同樣只支持VB.NET:(
好了,現在可以測試一下我們的Snippet了,將文件保存為.snippet文件,然后導入。

?? 還不錯吧?
Code Snippet 函數?
前面說到,<Imports>和<References>節點只能用于VB.NET,而這里的Code Snippet函數則只能用于C#。
在<Literal>和<Object>節點中,都包含了子節點<Function>,這些函數是VS的一部分,有時會比較有用。共有三個函數:
1. GenerateSwitchCases(EnumerationLiteral),根據提供的枚舉類型生成一個switch語句和一系列case語句,事實上,C#中已有這樣的一個例子:

回車確認:
2. ClassName(),返回Snippet所在類的名稱。
3. SimpleTypeName(TypeName),在Snippet所在的上下文中推斷出TypeName參數的最簡單形式。 下面以SimpleTypeName為例來看一下這些函數的用法:

XML Code <Snippet> ????<Code?Language="CSharp"> ????<![CDATA[ ????$NameOfDebug$.WriteLine($text$);$end$ ????]]> ????</Code> ????<Declarations> ????????<Literal> ????????????<ID>text</ID> ????????????<ToolTip>Text?to?write</ToolTip> ????????????<Default>"Text"</Default> ????????</Literal> ????????<Literal?Editable="false"> ????????????<ID>NameOfDebug</ID> ????????????<Function>SimpleTypeName(global::System.Diagnostics.Debug)</Function> ????????</Literal> ????</Declarations></Snippet>

這里比前面的Snippet添加了一個Literal,為什么需要這么做呢?我們知道System.Diagnostics命名空間默認情況下是沒有引用的,如果使用Debug類,還需要引用System.Diagnostics。這里的妙處在于VS會推斷NameOfDebug的最簡單形式,如果沒有引用System.Diagnostics,它會在Debug前面加上,否則就不會加上。
幾條建議?
首先,Snippet的定義都在XML中,因此也算得上是代碼,所以在命名上與其它代碼無異,都要選擇更有意義或者相關性的名字。命名快捷鍵的一個做法是使用首字母的縮寫,比如Assert.AreEqual(expected, actual);的快捷鍵為ae。
另外,記得填寫ToolTip節點的內容,這些內容在使用Snippet時會看到。 其它工具?
雖然Snippet可以簡化代碼輸入,可是它本身的編寫卻并非很方便,使用一些可視化工具會更好,比如Snippet Editor,有興趣可以試一下。
另外,這個世界還有很多人在編寫Snippet,比如gotcodesnippets.com,所以在動手編寫之前可以先搜索一下:)
小結?
本文介紹了Code Snippet的使用和編寫,它可以看作是代碼片段的模板,在粒度上比項目/項模板更小,從而進一步提高了工作效率。
參考
《Professional Visual Studio? 2008 Extensibility》

轉載于:https://www.cnblogs.com/weiqingqing/p/3415743.html

總結

以上是生活随笔為你收集整理的运用代码管理段来提升开发效率的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。