处理样品c#

时间:2015-06-08 06:46:31

标签: c# idisposable

查看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);
   }
}

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

我在第一个箭头中对于Dispose属于谁而感到困惑。到IDisposable或基础的虚拟处理?

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

3 个答案:

答案 0 :(得分:4)

/** * Push a value onto a session array. * * @param string $key * @param mixed $value * @return void */ public function push($key, $value) { $array = $this->get($key, array()); $array[] = $value; $this->put($key, $array); } / Dispose(true)的目的是让真正的代码 - Dispose(false) - 知道是通过dispose还是finalize来调用它。 virtual void Dispose(bool)特定于类(虚方法); Dispose(bool)只有无参数IDisposable方法。就这样:

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

(请注意Dispose(false)路线在完成后禁用完成步骤

此布尔标志很重要,因为在最终确定期间,您无法触及任何其他托管资源(因为顺序是非确定性的) - 只是非托管。此方法为Dispose(true)这一事实意味着子类可以将自己的清理代码添加到组合中。

但实际上,您需要实现终结器非常罕见;你不应该经常添加这么多的样板。

答案 1 :(得分:2)

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

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

这永远不会自动调用,但始终由开发人员调用。 true标志表示已明确调用dispose。 GC.SuppressFinalize(this);告诉垃圾收集器已经处理了该对象的处理。无需调用finalize块。

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

如果尚未明确处置该对象,则垃圾收集器会自动调用此方法。它确切地被调用时是不确定的,但有时当对象超出范围并被标记为垃圾收集时。 false标志表示这是一个自动处理,在这种情况下,不再需要明确处理托管对象。

此外,还有关于Ben Watson编写高性能.NET代码的终结器的补充说明

  

除非需要,否则不要实施终结器。终结器是由垃圾触发的代码   收集器清理非托管资源。它们是从单个线程调用的,一个在后面   另外,只有在垃圾收集器声明对象在收集后死亡之后。这个   意味着如果你的类实现了终结器,你就可以保证它会留在内存中   甚至在应该杀死它的收集之后。这降低了整体GC效率   确保您的程序将专用CPU资源来清理对象。

答案 2 :(得分:0)

此实施:

public void Dispose(){...}

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

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

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