终结者和IDisposable

Raj*_*Rao 9 c# garbage-collection dispose idisposable finalizer

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

但是,如果实现IDisposable(以便提供处理对象的确定性方法),您是否需要实现终结器?并且您没有任何非托管资源来清理?

在我看来,如果类只有托管资源,如果你不调用Dispose,那么托管资源将自动被GC清理,因此不需要实现终结器.我错了吗?

另外,如果我使用我的Dispose方法清理事件处理程序,该怎么办?由于Dispose不会自动被GC调用,我应该实现Finalizer,以确保事件处理程序无线连接吗?

SLa*_*aks 10

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

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

如果该类不是sealed,则应该GC.SuppressFinalize(this)在其Dispose()继承的类添加终结器的情况下调用其方法.

  • @Henk:嗯?你在说什么?`SuppressFinalize`由非虚拟`Dispose()`方法调用,应该在任何情况下调用.如果派生类添加了非托管资源,它应该在`Dispose(bool)`中清理它,并添加一个调用`Dispose(false)`的终结器.如果调用正常的`Dispose`方法,则会清除非托管资源,因此应该抑制终结器. (2认同)

adr*_*nks 10

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

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