【问题标题】:Finalize method guidelines and best practices in C# [closed]最终确定 C# 中的方法指南和最佳实践 [关闭]
【发布时间】:2012-05-21 06:20:36
【问题描述】:

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

我主要了解与内存管理/性能相关的问题,但我对“哪些代码应该/不应该进入 Finalize 方法”是否有任何准则感兴趣?

例如:

  1. 不要在 Finalize 方法中引发异常。
  2. 代码应该快速执行。
  3. 不要引发事件 (?)
  4. 等等……

在我的案例中,由于引发了导致某些异常的事件而出现了这种行为。

所以我的问题是——关于 finalize 方法,我必须遵循哪些准则(甚至可能使用某些工具强制执行)?

【问题讨论】:

    标签: c# .net coding-style finalize


    【解决方案1】:

    您调用 finalize 应该没有任何理由。尽管它对您开放,但使用 finalize 的最佳做法是不要使用它们。相反,从 IDisoposable 继承。这不仅是最佳实践,而且不会干扰垃圾收集,并且具有方便的“使用”子句来自动处理。继承这个类也向其他开发者说明这是一个有资源要处理的对象,而我是一个特殊的方式。 我什至认为 GC 会在垃圾运行期间调用 dispose。

    简而言之,你可以用 finalize 做的任何事情都最好用 dispose 来完成。

    【讨论】:

    • Using 子句适用于少数情况(某个对象的一次性使用),并不适用于所有用例。不过,我同意尽可能使用它。
    • 垃圾收集器从不调用 Dispose()
    • 我的错误@HansPassant 我的印象是确实如此。已编辑。
    【解决方案2】:

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

    来自MSDN

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

    Finalize 操作有以下限制:

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

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

    运行终结器的线程未指定

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 2011-11-05
      • 2011-02-11
      相关资源
      最近更新 更多