编辑:对于热心的编辑,请阅读完整的问题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 dispose
,here。此外,由于此问题不仅涉及处置,here是Microsoft在最后一行调用base
的另一个示例。
哪一个是正确的/最常见/更好的?
答案 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
}