我知道在 C# 中,如果您编写~MyClass()
,这基本上会转换为override System.Object.Finalize()
. 因此,无论您是否编写析构函数,CLR 中的每种类型都将有一个Finalize()
方法(System.Object
至少)。
1] 那么,这是否意味着,默认情况下,每个对象都有一个终结器?
2] CLR 决定一个对象应该进入终结队列的依据是什么?
我问这个,因为,我有一个类,说ManagedResourceHolder
已实现IDisposable
,但没有调用GC.SuppressFinalize(this)
它的IDisposable.Dispose()
方法。该类没有任何非托管资源,并且不需要该~ManagedResourceHolder()
方法,这反过来意味着不需要 GC.SuppressFinalize(this)
调用,因为没有终结器。
3] 在上述情况下,实现 IDisposable 时是否总是需要提供终结器?(即使在一个没有非托管资源的类上)
FxCop 规则CA1816违反了这一点,当我在 MSDN 上的 CA 论坛上提问时,我得到的回复让我感到困惑。
谢谢。