c# - 为什么传统的 Dispose 模式会抑制 finalize?

标签 c# dispose finalize

假设这是传统的 Dispose 模式(取自 devx 但在许多网站上都能看到)

class Test : IDisposable
{
  private bool isDisposed = false;

  ~Test()
  {
    Dispose(false);
  }

  protected void Dispose(bool disposing)
  {
    if (disposing)
    {
      // Code to dispose the managed resources of the class
    }

    // Code to dispose the un-managed resources of the class

    isDisposed = true;
  }

  public void Dispose()
  {
    Dispose(true);
    GC.SuppressFinalize(this);
  }
}

我不明白为什么我们调用 GC.SupressFinalize(this)。这需要我编写自己的托管资源处置,包括清空我的引用?我有点失落,我必须承认。有人可以阐明这种模式吗?

理想情况下,我只想处理我的非托管资源,让 GC 自己进行托管收集。

其实,我什至不知道为什么要指定终结器。无论如何,编码器应该自己调用 dispose,现在不是吗?如果这只是一种后备机制,我会删除它。

最佳答案

使用 IDisposable 模式,以便在客户端代码调用 Dispose 方法时,对象可以确定性地清理其资源。

如果客户端代码由于某种原因无法调用 Dispose,终结器仅作为备用。

如果客户端代码调用 Dispose,那么资源清理会立即执行,并且不需要在完成期间再次完成。在这种情况下调用 SuppressFinalize 意味着该对象不再产生额外的 GC 终结成本。

而且,如果您自己的类仅使用托管 资源,则完全不需要终结器:GC 将处理所有托管资源,让这些资源自己担心是否它们 需要一个后备终结器。如果它直接处理非托管资源,您应该只考虑在您自己的类中使用终结器。

关于c# - 为什么传统的 Dispose 模式会抑制 finalize?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4485839/

相关文章:

C# "using"语句中的匿名对象可靠吗?

c# - WinForms 和处理自定义控件

ada - 在 Ada(2005 或 2012)中实现与 java finalize block 等效的最佳实践

Kotlin super.finalize()

c# - 如何将公历日期转换为波斯日期?

c# - 从 Bot 类外部访问 BotState 变量

c# - SmtpClient.Dispose 抛出 System.IO.IOException

c# - 处理困惑的界面层次结构 (MSHTML) 的最佳方法是什么?

c# - 使用 PM/AM 解析日期时间

c# - 完成队列释放速度不够快