【问题标题】:Why does IsDisposed return false after calling Dispose()?为什么 IsDisposed 在调用 Dispose() 后返回 false?
【发布时间】:2014-05-07 10:22:55
【问题描述】:

我正在尝试清除 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                }
        }
    }

【问题讨论】:

  • ToolStripItem 是“精简”控件,它们不使用窗口。并且不要从 Control 类派生。这通常意味着他们实际上没有任何值得处理的东西。让他们也很麻烦。

标签: c# winforms dispose


【解决方案1】:

无论出于何种原因,最初的 .NET 开发人员决定仅在已处置的 ToolStripItem 具有非空 Owner 属性(您最好将其间接设置为 null 行)时翻转 IsDisposed 标志前)。这似乎没有任何进一步的影响 - 即您可以假设 ToolStripItem 尽管存在这种奇怪的行为,但已被安全处置。

至于您的更广泛的问题 - IDisposable 接口不提供任何检查对象是否被释放的方法(更糟糕的是 - 实现它的类不必保证在调用时无异常执行不止一次(见MSDN))。如果对象实际被释放,您需要依赖上述类的开发人员提供一些信息(这可以在ToolStripItem 示例中看到,这不是一个万无一失的方法),或者在您的代码中以某种方式跟踪它。

话虽如此,但在现实生活中很少会成为问题(尽管意识到这一点很有用)。

【讨论】:

  • 为什么 .NET 开发者不给我们一个像 Delphi 那样的 .Free 方法。
  • @user3611669 主要是因为 .NET 背后的主要思想之一是您不需要 Free 函数,即内存由运行时环境管理,而不是由开发人员管理(我不想要讨论利弊)。 .NET 的 Dispose != Delhpi 的 Free(至少就我对 Delphi 的有限了解而言),在大多数正常情况下,Dispose 不会影响可用内存量。
猜你喜欢
  • 2010-10-12
  • 2021-07-23
  • 2013-09-18
  • 2014-11-17
  • 2014-03-11
  • 2019-07-12
  • 2012-08-24
  • 2013-03-08
相关资源
最近更新 更多