2009-05-05 41 views
77

是否有自動方式來同步接口和其實現之間的註釋? 我目前正在記錄它們,並且不想手動保持它們同步。在C#中同步接口和實現註釋的方法

更新:當我創建一流這樣

interface IFoo{ 
    /// <summary> 
    /// Commenting DoThis method 
    /// </summary> 
    void DoThis(); 
} 
class Foo : IFoo { 
    public void DoThis(); 
} 

IFoo foo=new Foo(); 
foo.DoThis();//comments are shown in intellisense 

這裏評論沒有顯示:

考慮以下代碼

Foo foo=new Foo(); 
foo.DoThis();//comments are not shown in intellisense 

<inheritDoc/>標籤將完美地生成Sand Castle中的文檔,但它在智能感知工具提示中不起作用。

請分享您的想法。

謝謝。

+0

添加文檔標籤 – 2009-05-05 09:21:39

+0

該功能是否實現? http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3745102-add-intellisense-support-for-the-inheritdoc-ta – hellboy 2014-02-25 12:47:41

+0

如何讓Atomineer Pro爲實現生成文檔標記如果接口的文檔可用? – hellboy 2014-02-25 12:50:12

回答

51

您可以使用Microsoft Sandcastle(或NDoc)inheritdoc標籤輕鬆完成此操作。這個規範沒有正式支持,但自定義標籤完全可以接受,而且當微軟創建Sandcastle時,它確實選擇了複製這個(以及一個或兩個其他標籤)。

/// <inheritdoc/> 
/// <remarks> 
/// You can still specify all the normal XML tags here, and they will 
/// overwrite inherited ones accordingly. 
/// </remarks> 
public void MethodImplementingInterfaceMethod(string foo, int bar) 
{ 
    // 
} 

Here是從沙堡幫助文件生成器GUI,描述了充分的使用幫助頁面。

(當然,這並不是特別是「同步」,因爲你的問題中提到,但它似乎是你仍然尋找什麼。)

作爲一個說明,這聽起來像一個對我來說完全公平的想法,儘管我觀察到有些人認爲你應該總是在衍生和實施的課程中重新評論評論。 (我實際上是在記錄我的一個庫時做的,我沒有看到任何問題。)幾乎沒有任何理由讓評論完全不同,所以爲什麼不只是繼承並簡單實現呢?

編輯:關於您的更新,Sandcastle也可以幫您解決這個問題。 Sandcastle可以輸出用於輸入的實際XML文件的修改版本,這意味着您可以分發這個修改後的版本以及您的庫DLL,而不是直接由Visual Studio構建的DLL,這意味着您在intellisense中有註釋以及文檔文件(CHM,無論)。

0

不要這樣做。想想這樣 - 如果兩個評論都必須始終保持一致,那麼其中一個評論就沒有必要了。必須有評論的理由(除了某種奇怪的義務評論 - 阻止每個功能和變量),所以你需要弄清楚這個獨特的原因是什麼,並記錄它。

+2

我不會在這裏使用接口,我沒有在測試中假裝它。 – Valentin 2009-05-05 09:15:47

5

我平時寫的評論是這樣的:

/// <summary> 
/// Implements <see cref="IMyInterface.Foo(string, int)"/> 
/// </summary> 
/// <returns></returns> 

該方法僅適用於接口的,所以這個評論是不是在提示編碼時,甚至顯示。

編輯:

如果你想看到的文檔時,直接調用類和使用的界面,你需要把它寫兩次或使用像GhostDoc的工具。

3

嘗試GhostDoc!它爲我:-)

編輯:現在,我已經意識到的沙堡的支持<inheritdoc/>,我贊同Noldorin的帖子。這是一個更好的解決方案。不過,我仍然推薦GhostDoc。

+6

我個人不喜歡GhostDoc。它生成的文檔實際上沒有。這隱藏了事實沒有記錄的事實。只是個人意見,我不認爲這是一般的不好的事情。 – 2009-05-05 09:17:49

11

如果您尚未使用它,我強烈建議您使用名爲GhostDoc的免費Visual Studio插件。它簡化了文檔處理過程。看看有關相關問題的my comment

雖然GhostDoc將不會自動同步,它可以幫助您與以下情形:

你有一個公開的接口方法。在一個類中實現這個接口,按下GhostDoc快捷鍵Ctrl-Shift-D,接口中的XML註釋將被添加到實現的方法中。

轉到選項 - >鍵盤設置,並指定一個密鑰GhostDoc.AddIn.RebuildDocumentation(我用Ctrl-Shift-Alt-D)。現在 alt text http://i44.tinypic.com/10dd1f9.png

,如果你改變了接口上的XML註釋,只需按上實現的方法,這個快捷鍵,和文檔將被更新。不幸的是,這反過來也不適用。

0

隨着ReSharper的你可以複製它,但我不認爲這是在同步所有的時間。

2

我有更好的回答:FiXml

克隆的肯定是工作的方式,但它有顯著的缺點,例如:

  • 當原來的註釋變爲(開發期間經常發生), 其克隆不是。
  • 你正在生產大量的重複。如果您使用任何 源代碼分析工具(例如團隊城市中的重複查找器),它將主要查找您的意見。

當有人提到,存在Sandcastle<inheritdoc>標籤,但它在比較幾個缺點FIXML:

  • 沙堡生成編譯的HTML幫助文件 - 通常它不會修改 .xml包含提取的XML註釋的文件(最後,在編譯期間,這不能在運行中「動態地」執行 )。
  • 沙堡的執行力不強。例如。沒有 <see ... copy="true" />

查看Sandcastle's <inheritdoc> description瞭解更多詳情。

FiXml的簡短描述:它是由C#\ Visual Basic .Net生成的XML文檔的後處理器。它被實現爲MSBuild任務,所以很容易將它集成到任何項目中。它涉及一些有關這些語言編寫XML文檔惱人的情況:

  • 爲繼承從基類或接口的文檔不支持。 I.e.任何重寫成員的文檔都應該從頭開始寫,儘管通常至少要繼承其中的一部分。
  • 爲常用的文檔模板,如插入不支持「這種類型是單 - 利用其<see cref="Instance" />屬性來獲得它的唯一實例」,甚至是「初始化<CurrentType>類的新實例。」

爲了解決上述問題,提供了以下額外的XML標記:

  • <inheritdoc />, <inherited />標籤
  • <see cref="..." copy="..." /> ATTRIB在<see/>標籤中使用。

這是its web pagedownload page

0

我構建了一個庫來後處理XML文檔文件,以添加對< inheritdoc/>標記的支持。

雖然它對源代碼中的Intellisense沒有幫助,但它確實允許將修改的XML文檔文件包含在NuGet包中,因此可以在引用的NuGet包中使用Intellisense。

更多的信息在www.inheritdoc.io(免費版本可用)。