为什么winform Dispose方法缺少"检测冗余调用">?
Winform now 处置方法:
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
为什么不这样做?
private bool disposedValue = false; //To detect redundant calls
protected override void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
disposedValue = true;
}
}
有两个合理的立场可以采取。
-
Dispose
可以调用两次。文档支持这一点,并表明无需进行disposedValue
检查。 -
Dispose
不应该被称为两次。但是,表格也不应该被处理两次,如果不是,同样不需要你的disposedValue
检查。
仅当某个子对象具有要解决的Dispose
的错误实现时,Dispose
内部的disposedValue
检查才有意义。
有自己的元素要释放时,你才需要有一个disposedValue
或其他机制,托管或非托管无关紧要。
如果你对Dispose
所做的唯一工作是调用其他人的Dispose
你不需要做任何事情,因为它们将允许重入(如果它们被正确实现(。
因此,在这种特殊情况下,您编写了不需要使用"disposedValue"标志。
话虽如此,Dispose 最常见的实现模式包含这样的标志(作为能够从继承者使用它的受保护属性(。