在C#中同步接口和实现注释的方法

是否有自动的方式来同步接口和它的实现之间的评论? 我目前正在logging他们,不想手动保持同步。

更新:

考虑这个代码:

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

当我创build这样的课程:

 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中的文档,但在智能感知工具提示中不起作用。

请分享你的想法。

谢谢。

您可以使用Microsoft Sandcastle(或NDoc) inheritdoc标记轻松完成此操作。 这个规范没有正式的支持,但是自定义标签是完全可以接受的,事实上微软在创buildSandcastle的时候select了从NDoc拷贝这个(和一个或者两个其他的标签)。

 /// <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) { // } 

这里是Sandcastle帮助文件生成器GUI的帮助页面,它完整地描述了它的用法。

(当然,这不是特别的“同步”,因为你的问题提到了,但它看起来正是你要的东西)。

作为一个说明,这听起来对我来说是一个完全公平的想法,尽pipe我已经观察到有些人认为你应该总是在派生和实现的类中重新指定注释。 (我实际上是在logging我的一个库的时候做的,而且我没有看到任何问题。)几乎没有任何理由让评论有所不同,那么为什么不只是inheritance和简单的方法呢?

编辑:关于你的更新,Sandcastle也可以为你照顾。 Sandcastle可以输出用于input的实际XML文件的修改版本,这意味着您可以将此修改后的版本与您的库DLL一起分发,而不是直接由Visual Studio构build,这意味着您在intellisense中有注释,以及文档文件(CHM,不pipe)。

如果你没有使用它,我强烈推荐一个名为GhostDoc的免费的Visual Studio插件。 它简化了文档的过程。 看看我有关相关问题的评论 。

尽pipeGhostDoc不会自动进行同步,但它可以帮助您解决以下情况:

你有一个logging的接口方法。 在一个类中实现这个接口,按下GhostDoc快捷键Ctrl-Shift-D ,接口中的XML注释将被添加到实现的方法中。

转到选项 – >键盘设置,并为GhostDoc.AddIn.RebuildDocumentation (我使用Ctrl-Shift-Alt-D )分配一个键。 替代文字160wpb4.png

现在,如果您更改了界面上的XML注释,只需在实现的方法上按下此快捷键,文档将被更新。 不幸的是,这反过来也不行。

我通常写这样的评论:

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

这些方法只能用于接口,所以在编码时甚至不会在工具提示中显示这个注释。

编辑:

如果您想在直接调用该类而不使用该接口时看到文档,则需要将其写入两次或使用像GhostDoc这样的工具。

试试GhostDoc ! 这个对我有用 :-)

编辑:现在我已经知道了Sandcastle对<inheritdoc/>的支持,我赞同Noldorin的post。 这是一个更好的解决scheme。 不过,我仍然推荐GhostDoc。

我有一个更好的答案: FiXml

克隆的方法肯定是工作方式,但是它有很大的缺点,例如:

  • 当原始评论被改变(在开发过程中经常发生),其克隆不是。
  • 你正在生产大量的重复。 如果您使用任何源代码分析工具(例如团队城市中的重复查找器),它将主要查找您的评论。

如前所述, Sandcastle中有<inheritdoc>标记 ,但与FiXml相比,它有很多缺点:

  • Sandcastle生成编译的HTML帮助文件 – 通常它不会修改包含提取的XML注释的.xml文件(最后,这不能在编译期间“在运行中”完成)。
  • 沙堡的实施不那么强大。 例如,不是<see ... copy="true" />

有关更多详细信息,请参阅Sandcastle的<inheritdoc>描述 。

FiXml的简短描述:它是由C#\ Visual Basic .Net生成的XML文档的后处理器。 它被实现为MSBuild任务,因此很容易将其集成到任何项目中。 它解决了一些与以这些语言编写XML文档有关的烦人案例:

  • 不支持从基类或接口inheritance文档。 即任何重写成员的文档都应该从头开始编写,尽pipe通常至less要inheritance其中的一部分。
  • 不支持插入常用的文档模板 ,比如“这个types是单例 – 使用它的<see cref="Instance" />属性来获取它的唯一实例”,甚至“初始化一个新的<CurrentType>阶级“。

为了解决上述问题,提供了以下附加的XML标签:

  • <inheritdoc />, <inherited />标记
  • <see cref="..." copy="..." /> <see/>标记中的<see cref="..." copy="..." />属性。

这是它的网页和下载页面 。

不要这样做。 这样想 – 如果两个评论都要求一直都是一样的话,那么其中一个评论是不必要的。 评论的原因之一(除了某种奇怪的义务评论 – 阻止每个function和variables),所以你需要弄清楚这个独特的原因是什么,并logging下来。

 /// <inheritDoc/> 

在这里阅读

用这个

有了ReSharper,你可以复制它,但我不认为它一直在同步。