我最近遇到的问题与在Finalize方法重载中运行的代码有关。
我大部分都知道与内存管理/性能有关的问题,但我感兴趣的是“是否应该/不应该在Finalize方法中使用哪些代码”?
例如:
我的案例中的行为是由于引发的事件导致了一些异常。
所以我的问题是 - 关于最终化方法,我必须遵循哪些指导原则(甚至可能强制使用某些工具)?
答案 0 :(得分:7)
结束只是为了摆脱非托管资源
来自MSDN
如果Finalize或Finalize的覆盖引发异常,并且运行时不由覆盖默认策略的应用程序托管,则运行时将终止该进程,并且不会执行活动的try-finally块或终结器。如果终结器无法释放或破坏资源,则此行为可确保进程完整性。
Finalize操作具有以下限制:
在垃圾回收期间执行终结器的确切时间未定义。除非调用Close方法或Dispose方法,否则不保证在任何特定时间释放资源。
两个对象的终结器不保证以任何特定顺序运行,即使一个对象引用另一个对象。也就是说,如果对象A具有对象B的引用并且两者都具有终结器,则当对象A的终结器开始时,对象B可能已经完成。
运行终结器的线程未指定
答案 1 :(得分:2)
你应该没有理由调用finalize。虽然它可以覆盖你,但使用finalize的最佳做法是不使用它们。相反,继承自IDisoposable。这不仅是一种最佳实践,它不会干扰垃圾收集,并且具有方便的“使用”子句来自动处理。继承这个类还要向其他开发人员注意,这是一个有资源可以处理的对象,而且我是一种特殊的方式。 我甚至认为GC会在垃圾运行期间调用dispose。 德尔>
简而言之,使用dispose可以更好地完成任务。