Finalizer和IDisposable

基于文档(MSDN:链接),很明显,在实现终结器时应该使用IDisposable模式。

但是如果你实现了IDisposable(为了提供一种确定的方式来处理对象),你是否需要实现一个终结器,并且你没有任何非托管资源来清理?

正如我所看到的,如果该类只有托管资源,并且不调用Dispose,则受管资源将自动由GC清理,因此不需要实现终结器。 我错了吗?

此外,如果我正在使用Dispose方法清理事件处理程序,该怎么办? 由于Dispose不会自动被GC调用,我是否应该实现Finalizer,以确保eventhandlers得到无线连接?


不,如果您有一个实现了IDisposable的类(即您已经正确实现了模式,并且只有托管资源可以处理),则不需要实现终结器。

(如果这样做,它实际上会影响对象的生命周期,因为带有终结器的对象会被添加到GC中的终止队列中,并且可能会比他们需要的寿命更长 - 如果对象很大,这可能会成为问题。)


除非拥有非托管资源,否则不应添加终结器。

拥有托管可支配资源但不是非托管资源的类应实现完整的Dispose模式,但不能有终结器。

如果该类未sealed ,则应在其Dispose()方法中调用GC.SuppressFinalize(this)以防继承类添加终结器。


  • 不,你是对的,如果你的对象持有一个拥有非托管资源的对象,那么你应该实现IDisposable,这样你就可以在你的Dispose上调用它的Dispose,但是你不需要终结器,因为它的终结者将会处理这个问题。

  • 事实上,试图在决赛中与可决定成员一起做任何事情都是充满的,因为决赛者将运行的命令不是确定性的,所以如果你尝试这样做,你会得到一些令人讨厌的错误。

  • 一般来说,让一个类拥有1或0个非托管资源会更好。 如果它有1个非托管资源,它应该有其他需要处理的状态(即没有其他一次性成员)。 SafeHandle是处理这个问题的好方法。 如果一个类需要处理几个非托管资源,它应该通过这些处理程序类来处理所述资源。 然后一个终结者和IDisposable变得容易; 要么你有唯一的非托管资源来处理这两种情况(如果处置被称为压制终结者),或者你只需​​要IDisposable。

  • 因为不得不直接处理非托管资源相对来说很少,所以你可能永远不需要编写一个finaliser(我认为我曾经用真实代码做过一次)。 因为明智的人在处理非托管资源的类中做得不多,所以整个Dispose(布尔)事物也是不必要的。

    链接地址: http://www.djcxy.com/p/54489.html

    上一篇: Finalizer and IDisposable

    下一篇: How to Dispose an object using Dispose method