如何使用XML注释记录C#代码的最佳实践?

39
我正在查看我刚编写的一些新代码,并为我的类和方法添加 NDoc 样式注释。我希望生成一个相当不错的 MSDN 风格文档作为参考。
总体而言,在编写类和方法注释时有哪些好的指导方针?NDoc 注释应该说什么?不应该说什么?
我发现自己经常查看 .NET Framework 的注释,但这很快就会变得老套;如果我能有一些好的规则来指导自己,我就可以更快地完成文档。
8个回答

62

在用于构建API文档的注释中,您应该:

  • 解释方法或属性的作用,为什么它存在,并解释任何对代码使用者不自明的领域概念。

  • 列出参数的所有前提条件(不能为空、必须在特定范围内等)。

  • 列出可能会影响调用者处理返回值的后置条件。

  • 列出方法可能抛出的所有异常(以及在什么情况下可能会抛出)。

  • 如果存在类似的方法,请解释它们之间的区别。

  • 注意任何意外情况(例如修改全局状态)。

  • 枚举任何副作用(如果有)。


+1. 我认为文档的主要焦点应该是公共接口,特别是在生成外部文档时(doxygen、NDoc等)。客户不需要知道你的类的每个细节。此格式中不需要记录实现细节;主要关注点应该是公共接口、如何使用它、前/后条件以及Jeff指出的其他事项。 - stinky472
当然,公共接口应该有一致和有效的文档,但如果你的工作包括更新、修改或重写现有的代码库,私有和受保护实体的文档非常有帮助。 - EoRaptor013
但是你如何为其添加样式呢?我在哪里可以找到一个清晰、有用的XML注释文档的好例子呢?我认为这将是这个答案的一个很好的补充。 - Sinjai

18

如果你最终得到的评论没有任何价值,那它们只是浪费而已。

例如:

/// <summary>
/// Gets manager approval for an action
/// </summary>
/// <param name="action">An action object to get approval for</param>
public void GetManagerApprovalFor(Action action)

你没有增加任何价值,只是增加了更多需要维护的代码。

代码中经常充满这些多余的注释。


11
是的,我明白评论可能没有任何价值。这就是为什么我正在寻找有价值的评论指南。 - Esteban Araya
2
我认为这更像是文档不够清晰的例子,而不是不能使用该方法的例子。公共方法应该有额外的文档,如预期的异常、前提条件等。比如说,当操作为 null 时,该方法会做什么呢? - Joseph Ferris
4
虽然我同意你对于“多余评论”的看法,但“多余文档”是一个不同的问题。在某些情况下,你可能确实没有额外需要记录的内容,你的XML documentation string仅仅是方法名称的回声。但是,我仍然会添加文档字符串——部分原因是因为它确认该方法与其表面看起来的一样简单(而不是有人懒得记录该方法),更重要的是,如果缺少文档字符串,它看起来就不对。 - Justin
4
我希望我能给这个答案点赞100次。对于那些评论,我认为它们就像硬编码总是成功的 UnitTest 一样。你已经成功勾选了“我有评论”(或“我有单元测试”)的框,但完全未能使代码更易于维护、更稳定或以任何方式变得更好。 - mikemanne

6

StyleCop 提供代码和注释风格的提示。它所给出的建议与 MSDN 文档风格一致。

至于注释内容,它应该为您的代码使用者提供足够的信息,以便了解预期的行为类型。它还应该回答可能会产生的问题。因此,请尝试将代码用作不知道任何关于代码的人,或者更好地,请求其他人这样做。


我认为StyleCop是一个非常方便的提醒工具,当我在方法中添加/删除参数并忘记更新<params>节点时,它会提醒我。根据我上一份工作的经验,R#也可以实时完成这项任务。 - Jesse C. Slicer
另一个选项:Resharper可以在用户界面中完成这个操作。 - Francisco Aquino

5

不要忘记什么是有效的XML。例如:

/// <Summary>
/// Triggers an event if number of users > 1000
/// </Summary>

错误:无效的 XML。


5

对于属性,您的注释应指示该属性是只读的、写入的还是可读写的。如果查看所有官方的MS文档,属性文档注释总是以"获取...","获取或设置..." 开始,而且(很少见,通常避免只写属性)"设置..."


太好了!有关于方法和类的任何想法吗? - Esteban Araya
说实话,唯一认真对待文档注释的公司就是微软 :) 我会浏览他们的注释,了解他们的做法。他们肯定有关于注释格式和内容的标准。微软也很好地指出了方法抛出的异常。可悲的是,在我看来,文档注释最终被用作修复 C# 语言中的小问题的临时措施(例如依赖注释或编译器错误来查找属性是否只读,这让我感到恼火)。 - Matt Greer
3
我非常重视文档注释,并且我不是微软的员工。在好的文档注释、GhostDoc 和 Sandcastle/Sandcastle Help File Builder 的帮助下,我们的核心库有一个供开发人员参考的网站。我非常讨厌通过逐步执行代码来推断方法/属性的使用方式,而不是阅读简明的文档。 - Jesse C. Slicer

3

我在写 <summary> 注释时,包括了如果我调用该函数(或实例化该类)时想知道的信息。

我在写 <remarks> 注释时,包括了如果我负责调试或增强该函数或类时想要知道的信息。注意:这并不代替良好的内联注释。但有时候,函数/类内部工作的概述非常有帮助。


0

MSDN页面所述,您可以使用XML文档注释自动生成文档,这样如果您正在编写API并且不想在代码和文档上重复工作,同时还可以使它们保持同步 - 每次更改代码时,您都需要修改相应的注释并重新生成文档。

使用/doc进行编译,编译器将搜索源代码中的所有XML标记并创建一个XML文档文件,然后使用Sandcastle等工具生成完整的文档。


我理解XML文档的好处和使用方法。但我需要一些帮助,了解人们在这些注释中实际上发现有用的内容是什么。 - Esteban Araya
@Esteban Araya,就像我说的那样,接近你要记录文档的实际代码,让你可以即时记录更改,无需切换到另一个应用程序并搜索适当的修改位置。 - luvieere

0
关于注释的一件事是更新它们,太多人修改了一个函数然后没有改变注释以反映更改。

真的。我们过去通过将其作为标准代码审查清单的一部分来解决了这个问题。 - Joseph Ferris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接