Gui*_*doG 7 c# dispose winforms
我试图清除ToolStripDropDownButton中的所有项目.由于它们是一次性的,我在每个上面都使用dispose方法.但是我看到在调用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 }
}
}
Run Code Online (Sandbox Code Playgroud)
无论出于何种原因,最初的 .NET 开发人员决定IsDisposed仅在已处置ToolStripItem具有非空Owner属性(您之前间接将其设置为null行)时才翻转该标志。这似乎没有任何进一步的影响——也就是说,ToolStripItem尽管有这种奇怪的行为,你仍然可以假设它已被安全处置。
至于您更广泛的问题 -IDisposable接口不提供任何方法来检查对象是否已被处置(并且更糟糕的是 - 如果多次调用它,实现它的类不必保证无异常执行(请参阅MSDN) )。您需要依靠所述类的开发人员来提供一些信息,如果对象实际上已被处置(从示例中可以看出,这ToolStripItem不是一个万无一失的方法),或者在您的代码中以某种方式跟踪这一点。
话虽如此,它在现实生活中很少成为问题(尽管意识到这一点很有用)。