为什么调用Dispose()后IsDisposed返回false?

我正在尝试清除ToolStripDropDownButton中的所有项目。 由于它们是一次性的,所以我在它们每一个上都调用了处理方法。 但是我看到在调用dispose()方法之后,IsDisposed属性仍然返回false。 为什么是这样以及如何检查是否在任何对象上调用Dispose()? 在我目前的项目中,这不是问题(我希望),但我真的很想知道这里发生了什么......

我的代码到目前为止:

private void ClearDropDownAccessConnections()
{
    ToolStripItem button = null;

    for (int i = toolStripDropDownButtonAccess.DropDownItems.Count - 1; i > 0; i--)
    {
        button = toolStripDropDownButtonAccess.DropDownItems[i] as ToolStripItem;
        if ((button.Tag != null) && ((int)button.Tag == 10))
        {
            toolStripDropDownButtonAccess.DropDownItems.Remove(button);
            button.Dispose();
            //IF I CHECk HERE THEN button.IsDisposed IS STILL FALSE                }
        }
    }

无论出于何种原因,只有当处置的ToolStripItem具有非null Owner属性(您之前间接设置为null行)时,原始.NET开发人员才决定翻转IsDisposed标志。 这似乎没有任何进一步的影响 - 即你可以假设ToolStripItem安全地处理,尽管这种奇怪的行为。

至于你的更广泛的问题IDisposable接口不提供任何检查对象是否被丢弃的方法(并且使情况变得更糟 - 实现它的类不必保证如果多次调用它的异常免费执行(请参阅MSDN ))。 您需要依赖所述类的开发人员提供一些信息,如果对象实际处置(可以在ToolStripItem示例中看到,不是一种简单的证明方法),或者在代码中以某种方式跟踪它。

说了这么多,在现实生活中很少成为问题(尽管知道它是有用的)。

链接地址: http://www.djcxy.com/p/78871.html

上一篇: Why does IsDisposed return false after calling Dispose()?

下一篇: Unable to view ganglia dashboard