【发布时间】:2011-04-22 10:05:08
【问题描述】:
根据文档(MSDN:link),很明显在实现终结器时应该使用 IDisposable 模式。
但是,如果您实现了 IDisposable(以便提供一种确定性的方式来处理对象),并且您没有任何非托管资源需要清理,您是否需要实现终结器?
在我看来,如果该类只有托管资源并且您不调用 Dispose,则托管资源将自动被 GC 清理,因此无需实现终结器。我错了吗?
另外,如果我使用我的 Dispose 方法来清理事件处理程序会怎样。由于 Dispose 不会自动被 GC 调用,我是否应该实现一个终结器,以确保事件处理程序不连线?
【问题讨论】:
-
综合所有的cmets,我写了一篇关于这个问题的博文:blog.aggregatedintelligence.com/2010/10/…
-
许多关于终结器的信息是在 SafeHandle 类添加到 .Net 2.0 之前编写的。遵循 Dispose 模式可能会很好,因为将来维护您的代码的人可能会期望它,但是很少有类应该有终结器,而且我想不出 any 类派生自非平凡的基础应该有一个终结器。除非使用一些奥术魔法,否则终结器不会对事件做任何有用的事情;悬空事件将阻止终结器运行,除非或直到环境使它们的清理没有意义。
标签: c# dispose idisposable finalizer garbage-collection