【问题标题】:Why do C# destructors need to have XML Documentation?为什么 C# 析构函数需要有 XML 文档?
【发布时间】:2011-04-01 08:51:20
【问题描述】:

我喜欢尽量减少我的 C# 代码的 cmets 和 Xml 文档。在可能的情况下,更愿意让代码自行记录。

但如果我不对公共类的析构函数添加 Xml 注释,C# 编译器会发出警告。这是为什么呢?

是否有一些我应该在此处放入 Xml cmets 的有用信息,而我一直没有这样做。我从来没有发现自己需要阅读析构函数上的 cmets。编译器是不是太热心了?

【问题讨论】:

  • @Reed:顺便说一下,它是 C# 中的“析构函数”,而不是终结器。请参阅规范的第 10.13 节,其中开头是“析构函数是实现析构类实例所需操作的成员。”许多人认为这是一个错误的名称选择,并且我同意。 “终结者”会更好。但它们在 C# 中称为析构函数,而不是终结器。
  • @Reed Microsoft 不同意我认为:msdn.microsoft.com/en-us/library/66x5fx1b.aspx
  • @Reed:这取决于您阅读的规范版本。 ECMA 规范指的是终结器,但 MS 规范仍然指的是析构函数。
  • 我怀疑你的意思是因为没有客户可以直接调用 d'tor 似乎没有必要编写 doc cmets?
  • @Eric:谢谢 - 我习惯于查看 ECMA 规范。正如 Jon 所提到的,它的表述方式不同。

标签: c# finalizer


【解决方案1】:

如果您打开 XML Doc cmets,编译器会希望您在 API 中记录所有内容。析构函数是 API 的一部分,确实应该包含在内。

析构函数通常应该只存在于 IDisposable 类中,并且将其记录在案确实有助于信号/提醒人们在对象上调用 Dispose(),因为这样做(如果实施正确)将显着降低 GC 压力。

【讨论】:

    【解决方案2】:

    我怀疑,虽然我没有证据,但触发警告仅仅是因为它在所有未标记为私有的方法上查找 doc cmets。我怀疑有一个特定的规则是析构函数特别需要 cmets。

    【讨论】:

      【解决方案3】:

      这可能有助于任何使用您的代码的人准确了解终结器的作用。换句话说,如果您正在使用大量非托管资源,那么如果文档清楚地概述了您的类在这些资源被释放时如何处理这些资源,将会很有帮助。

      【讨论】:

        【解决方案4】:

        它坚持这一点,因为您的类是公共的,并且 C# 析构函数最终会覆盖 protected method,它可以从您的程序集外部看到。

        【讨论】:

        • 不,在 C# 中,Finalize() 的可见性甚至低于私有。析构函数也一样,即使在类内部也无法调用/查看它。
        • 您的程序集可能会被 C# 以外的其他语言重用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-06
        • 2021-10-09
        • 2010-11-16
        • 2013-05-22
        • 2014-02-02
        相关资源
        最近更新 更多