我正在尝试清除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 }
}
}
答案 0 :(得分:4)
无论出于何种原因,原始的.NET开发人员决定仅在被处置的IsDisposed
具有非空ToolStripItem
属性时才会翻转Owner
标记(您可以使用此属性)请在此之前间接设置为null
行。这似乎没有任何进一步的影响 - 即你可以假设ToolStripItem
安全处置,尽管这种奇怪的行为。
至于你更广泛的问题 - IDisposable
接口没有提供任何方法来检查对象是否被处置(并且更糟糕的是 - 实现它的类不必保证无异常执行,如果它& #39; s不止一次被召唤(见MSDN))。你需要依赖所述类的开发人员来提供一些信息,如果对象实际被处理掉(这可以在ToolStripItem
示例中看到,这不是一个简单的方法),或者在你的代码中以某种方式跟踪它。
说了这么多,它在现实场景中很少成为一个问题(虽然了解它有用)。