在哪里调用基方法

本文关键字:方法 调用 在哪里 | 更新日期: 2023-09-27 18:33:09

编辑:对于热心的编辑,请阅读完整的问题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);
}

Microsoft说CA2215: Dispose methods should call base class dispose,在这里。此外,由于这个问题不仅与处置有关,因此这是Microsoft最后一行调用base的另一个示例。

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

在哪里调用基方法

您的第二个代码段是可疑的,具体取决于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 
}
如果您

愿意,这一切都与调用顺序或控制流有关。

在第一个示例中,首先调用基

base.Dispose()的处置,然后在执行类本身的代码之后调用。在第二种情况下,反之亦然。

因此,从行为的角度来看,它们都是正确的,您必须选择最适合您当前要求的一种,它在同一程序中自然会有所不同。