处理样本 c#

Disposing Samples c#

查看MSDN的示例代码

// Design pattern for a base class.
public class Base: IDisposable
{
    private bool disposed = false;

    //Implement IDisposable.
    public void Dispose()
    {
          Dispose(true);      <---- 1 Here
          GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
         if (!disposed)
         {
             if (disposing)
             {
                 // Free other state (managed objects).
             }
             // Free your own state (unmanaged objects).
             // Set large fields to null.
             disposed = true;
         }
    }

   // Use C# destructor syntax for finalization code.
   ~Base()
   {
       // Simply call Dispose(false).
       Dispose (false);
   }
}

我似乎没有得到第一个箭头 (<----- 1 Here) 中指向的代码行。

我在第一个箭头中对 Dispose 属于谁感到困惑。到 IDisposable 还是 virtual Dispose 的基数?

任何对我有帮助的帮助都很棒,非常感谢!

Dispose(true) / Dispose(false) 的目的是让 真正的 代码 - virtual void Dispose(bool) - 知道它是否被调用通过处理或完成。 Dispose(bool) 特定于 class (虚拟方法); IDisposable 只有一个无参数的 Dispose() 方法。因此:

  • Dispose(true) 路由只会通过 IDisposable 调用 - 这通常意味着通过 using
  • Dispose(false) 路由只会通过垃圾收集器调用

(注意 Dispose(true) 路由 禁用 完成步骤)

这个布尔标志很重要,因为在完成过程中你不能触及 任何 其他托管资源(因为顺序是不确定的)——只能是非托管的。这个方法是 virtual 的事实意味着 subclasses 可以将他们自己的清理代码添加到组合中。

但实际上,非常 很少需要实现终结器;你不应该经常添加这么多样板文件。

在这种情况下,Dispose 属于调用者 aka dev。

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

这永远不会自动调用,而总是由开发人员调用。 true 标志表示显式调用了处置。 GC.SuppressFinalize(this); 告诉垃圾收集器该对象的处理已经处理完毕。无需调用 finalize 块。


~Base()
{
    // Simply call Dispose(false).
    Dispose (false);
}

如果对象没有被显式处理,垃圾收集器会自动调用它。它何时被调用是不确定的,但有时当对象超出范围并被标记为垃圾收集时。 false 标志表示这是一种自动处置,在这种情况下不再需要显式处置托管对象。

此外,关于终结器的附加说明取自 Ben Watson 的编写高性能 .NET 代码

Never implement a finalizer unless it is required. Finalizers are code, triggered by the garbage collector to cleanup unmanaged resources. They are called from a single thread, one after the other, and only after the garbage collector declares the object dead after a collection. This means that if your class implements a finalizer, you are guaranteeing that it will stay in memory even after the collection that should have killed it. This decreases overall GC efficiency and ensures that your program will dedicate CPU resources to cleaning up your object.

此实现:

public void Dispose(){...}

用于使用此 class 的 Dispose 方法中的其他方法。这个实现:

protected virtual void Dispose(bool disposing){...}

是为了使用 class 本身意味着如果其他人在他们的代码上使用 Dispose(),那么可以做一些在受保护方法上管理的其他事情,但是如果垃圾收集器处理它,它不会 运行 托管代码