最终确定C#中的方法指南和最佳实践

时间:2012-05-13 12:59:26

标签: c# .net coding-style finalize

我最近遇到的问题与在Finalize方法重载中运行的代码有关。

我大部分都知道与内存管理/性能有关的问题,但我感兴趣的是“是否应该/不应该在Finalize方法中使用哪些代码”?

例如:

  1. 不要在Finalize方法中抛出异常。
  2. 代码应该快速执行。
  3. 不要举起活动(?)
  4. 等等...
  5. 我的案例中的行为是由于引发的事件导致了一些异常。

    所以我的问题是 - 关于最终化方法,我必须遵循哪些指导原则(甚至可能强制使用某些工具)?

2 个答案:

答案 0 :(得分:7)

结束只是为了摆脱非托管资源

来自MSDN

  

如果Finalize或Finalize的覆盖引发异常,并且运行时不由覆盖默认策略的应用程序托管,则运行时将终止该进程,并且不会执行活动的try-finally块或终结器。如果终结器无法释放或破坏资源,则此行为可确保进程完整性。

     

Finalize操作具有以下限制:

     

在垃圾回收期间执行终结器的确切时间未定义。除非调用Close方法或Dispose方法,否则不保证在任何特定时间释放资源。

     

两个对象的终结器不保证以任何特定顺序运行,即使一个对象引用另一个对象。也就是说,如果对象A具有对象B的引用并且两者都具有终结器,则当对象A的终结器开始时,对象B可能已经完成。

     

运行终结器的线程未指定

答案 1 :(得分:2)

你应该没有理由调用finalize。虽然它可以覆盖你,但使用finalize的最佳做法是不使用它们。相反,继承自IDisoposable。这不仅是一种最佳实践,它不会干扰垃圾收集,并且具有方便的“使用”子句来自动处理。继承这个类还要向其他开发人员注意,这是一个有资源可以处理的对象,而且我是一种特殊的方式。 我甚至认为GC会在垃圾运行期间调用dispose。

简而言之,使用dispose可以更好地完成任务。