在哪里调用基本方法?

时间:2013-09-29 13:46:22

标签: c# .net

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

到目前为止,我见过this

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

this

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 disposehere。此外,由于此问题仅涉及处置,here是Microsoft在最后一行调用base的另一个示例。

哪一个是正确的/最常见/更好的?

2 个答案:

答案 0 :(得分:2)

如果您愿意,那就是关于序列的调用或控制流。

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

因此,从行为的角度来看,它们都是正确的,你必须选择最适合你当前要求的那个,它可以在同一个程序中自然地改变。

答案 1 :(得分: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 
}