为什么winform Dispose方法缺少'检测冗余调用'?

时间:2017-03-16 07:05:06

标签: c# .net winforms

为什么winform Dispose方法缺少'检测冗余调用'

现在Winform Dispose方法:

   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;
        }
    }

2 个答案:

答案 0 :(得分:3)

有两个合理的立场。

  • Dispose可以被调用两次。文档支持此功能,并建议您无需进行disposedValue检查。

  • Dispose不应该被调用两次。但是,表格也不应该被处理两次,如果不是,则同样不需要进行disposedValue检查。

disposedValue内的Dispose检查只有在某个子对象有一个您想要解决的Dispose错误实现时才有意义。

答案 1 :(得分:0)

只有拥有自己的免费,管理或非托管元素并不重要,才需要disposedValue或其他机制。

如果您在Dispose上执行的唯一工作是调用其他Dispose,则不需要执行任何操作,因为它们将允许重入(如果它们已正确实施)。

所以在这个特殊情况下你写道你不需要使用'disposValue'标志。

已经说过Dispose最常见的实现模式包含这样的标志(作为受保护的属性,能够从继承者使用它)。