.net 我应该在IDisposable和Finalize上实现GC.supersFinalize吗?

.net 我应该在IDisposable和Finalize上实现GC.supersFinalize吗?,.net,garbage-collection,idisposable,finalizer,suppressfinalize,.net,Garbage Collection,Idisposable,Finalizer,Suppressfinalize,我新客户处的代码审查清单包含以下内容: 实现Dispose和Finalize的类应该在Dispose实现中调用GC.supersFinalize 为什么? 它不应该读为实现IDisposable接口的类,应该在Dispose实现中调用GC.supersFinalize吗 还是我遗漏了一些愚蠢的东西?你遗漏了一个事实,即不是每个一次性类都需要终结器——事实上,很少有人需要终结器。如果没有终结器,为什么需要调用SuppressFinalize?这很准确。如果Dispose(bool)方法完成了它的工

我新客户处的代码审查清单包含以下内容:

实现Dispose和Finalize的类应该在Dispose实现中调用GC.supersFinalize

为什么?

它不应该读为实现IDisposable接口的类,应该在Dispose实现中调用GC.supersFinalize吗


还是我遗漏了一些愚蠢的东西?

你遗漏了一个事实,即不是每个一次性类都需要终结器——事实上,很少有人需要终结器。如果没有终结器,为什么需要调用
SuppressFinalize

这很准确。如果Dispose(bool)方法完成了它的工作,那么让终结器再次完成它就没有任何意义了。调用GC.SuppressFinalize()是一种优化,您可以避免.NET费心调用一个什么都不做的终结器

我注意到您用大写字母C编写了类。这暗示您正在用VB.NET编写代码。注意,IDE在99.99%的情况下都是错误的。键入“Implements IDisposable”后按Enter键后,将立即插入错误代码:

恶心。这是终结器的样板实现,在MSDN库中有很好的文档记录。顺便说一句,这是错误的。实际上需要终结器是非常罕见的,因为.NET类已经自己处理了它。如果您确实使用了操作系统句柄,那么您应该使用一个SafeHandle派生类。或者写你自己的包装

将其编辑回:

Public Sub Dispose() Implements IDisposable.Dispose
    someField.Dispose()
    '' maybe some more
    ''...
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
    someField.Dispose()
    '' maybe some more
    ''...
End Sub