Finalizer和IDisposable

12 浏览
0 Comments

Finalizer和IDisposable

根据文档(MSDN:链接),很明显在实现终结器时应使用 IDisposable 模式。但是如果你实现了 IDisposable(因此提供了一种确定性的处理对象的方式)并且没有未受管理的资源需要清理,那么是否需要实现终结器呢?据我看,如果类只有托管资源并且如果不调用 Dispose,则 GC 会自动清理托管资源,因此没有必要实现终结器。我错了吗?另外,如果我使用 Dispose 方法清理事件处理程序,由于 GC 不会自动调用 Dispose,我是否应该实现终结器以确保事件处理程序被释放?

admin 更改状态以发布 2023年5月21日
0
0 Comments

除非您有一些未托管的资源,否则不应该添加finalizer。

拥有托管可释放资源但不包括未托管资源的类应该实现完整的Dispose模式,但不应该有finalizer。

如果该类没有被sealed,则应该在其Dispose()方法中调用GC.SuppressFinalize(this)以防继承类添加finalizer。

0
0 Comments

如果你的类已经实现了IDisposable接口(也就是你已经正确地实现了这种模式,并且你只需要处理托管资源),那么你不需要再实现Finalizer。

(如果你继续实现Finalizer,事实上就会影响到对象的生命周期。带有Finalizer的对象会被添加到GC的终结队列中,可能会比它们需要的寿命更长,如果你的对象比较大,这可能会成为一个问题。)

0