3

编辑:对于热心的编辑,请阅读完整问题In addition, since this question is not only about disposing

到目前为止,我已经看到了这个

protected override Dispose(bool disposing)
{
    base.Dispose(disposing);
    if (disposing)
       c.Dispose()
}

:_

protected virtual void Dispose(bool disposing)
{
    if (!disposed)
    {
        if (disposing)
        {
            // Dispose managed resources.
        }

        // There are no unmanaged resources to release, but
        // if we add them, they need to be released here.
    }
    disposed = true;

    // If it is available, make the call to the
    // base class's Dispose(Boolean) method
    base.Dispose(disposing);
}

微软说CA2215: Dispose methods should call base class dispose在这里。另外,由于这个问题不仅仅是关于配置的,这里是微软base在最后一行调用的另一个例子。

如果有的话,哪一个是正确的/最常见的/更好的?

4

2 回答 2

2

您的第二个片段值得怀疑,这取决于是否disposed是基类中的受保护字段。

protected virtual void Dispose(bool disposing)
{
    if (!disposed)
    {
        if (disposing)
        {
            // Dispose managed resources.
        }    
    }
    disposed = true;    
    base.Dispose(disposing);   // wrong if base.Disposing() depends on disposed
}

要考虑的问题是基类和派生类之间的异常和依赖关系。所以使用 try/finally 并将基本调用放在最后。最一般的模式如下所示:

protected virtual void Dispose(bool disposing)
{     
  if (!disposed)
  {
     if (disposing)
     {
        // Dispose managed resources.
     }            
  }           
  base.Dispose(disposing);       
  disposed = true;   // inherited or local field 
}
于 2013-09-29T13:59:01.727 回答
2

如果您愿意,这完全是关于调用序列或控制流的。

base.Dispose()在第一个示例中,首先调用基类的处理,然后执行类本身的代码。相反,在第二种情况下,反之亦然。

因此,从行为的角度来看,它们都是正确的,并且您必须选择最适合您当前需求的那个,它可以在同一程序中自然而然地在类型方面有所不同。

于 2013-09-29T13:48:38.393 回答