为什么传统的Dispose模式抑制最终化?

Laz*_*zlo 9 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么打电话GC.SupressFinalize(this).这需要我编写自己的托管资源处理,包括清空我的引用?我必须承认,我有点迷茫.有人会对这种模式有所了解吗?

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

实际上,我甚至不知道为什么我们指定一个终结器.在任何情况下,编码人员都应该自己处理,现在不应该他?如果这只是一个后备机制,我会删除它.

Luk*_*keH 14

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

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

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

而且,如果你自己的类只使用管理资源,那么finaliser是完全没有必要的:GC将采取任何管理资源的照顾,让这些资源本身担心是否他们需要一个备用finaliser.如果它直接处理非托管资源,您应该只考虑自己类中的终结器.