删除 TabPage:Dispose 或 Clear 或两者兼而有之?

Posted

技术标签:

【中文标题】删除 TabPage:Dispose 或 Clear 或两者兼而有之?【英文标题】:Remove TabPage: Dispose or Clear or both? 【发布时间】:2010-12-17 22:41:39 【问题描述】:

我正在开发一个具有名为 tabDocuments 的 TabControl 的 Windows 窗体。我遇到了从 TabControl 中删除所有页面的这段代码。

for (int i = tabDocuments.TabPages.Count - 1; i > -1; i--) 
    tabDocuments.TabPages[i].Dispose();

    tabDocuments.TabPages.Clear();

编写此代码的人已经离开了一段时间。我试图理解为什么代码在处理每个 tabPages 后调用 Clear() (对我来说看起来没有必要)。谁能向我解释为什么?还是额外调用 Clear()?

【问题讨论】:

【参考方案1】:

在每个标签页上调用 Dispose() 实际上并没有将它们从 TabPages 集合中删除,它只是将它们释放。对 Clear() 的调用将它们从集合中删除。如果您不调用 Clear(),它们仍然会在那里,并且很可能会发生不好的事情,因为您最终会在它们被处理后尝试使用它们。

【讨论】:

根据我的实验,处理一个标签页会将其从 TabControl 中删除 这太令人惊讶了!我没有意识到这一点。 即使是,也不应该将 at 用作代码模式,它可能会导致其他 Disposable 对象出现错误。 @Marty 在创建示例项目并尝试之前我也不知道这一点:)。 你的回答很有道理。根据文档所说的方法将执行的操作。但是,由于 Dispose 方法具有其他未记录的功能(不是错误,只是未记录),因此 clear 调用并非完全必要,但在我看来仍然是一种很好的做法。【参考方案2】:

首先从集合中删除一个 Tab,然后是 Dispose()。永远不要 Dispose() 仍在使用的东西,因为它会导致异常和奇怪的行为。

另外,确保没有其他人对选项卡有引用,否则这些引用将在 Dispose() 上无效。

【讨论】:

所有控件不都是这样吗?这就是 IsDisposed 属性存在的原因... 通常您不会 Dispose 控件,它们存在于整个应用程序中,并且不会保留关键的非托管资源。您可能希望将表单用作一次性对话框。然后表单将释放其控件。【参考方案3】:

这个 sn-p 来自 Control.Dispose:

        if (this.parent != null)
        
            this.parent.Controls.Remove(this);
        

因此您只需调用 Dispose,而不是 Clear。

【讨论】:

谢谢,您在哪里找到 Control.Dispose 的 sn-p? @Xaero,虽然,您对控件从其父级中删除自己是正确的。您只是碰巧通过拆卸组件才知道这一点。该方法的公共文档中没有任何地方说它将自己从父级中删除。在框架的未来版本中可以更改此功能。我知道调用程序集可以针对特定版本的 .NET 框架。但是,根据公共文档调用方法不是更好的做法(即使没有必要)。

以上是关于删除 TabPage:Dispose 或 Clear 或两者兼而有之?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 TabControl 隐藏 TabPage [重复]

Datatable.Dispose() 会使其从内存中删除吗?

更改“ReproClass”上的 Dispose 方法以在此字段上调用 ​​Dispose 或 Close

我需要 Dispose() 或 Close() EventWaitHandle 吗?

C#中关于TabPage隐藏与显示的问题

我应该为流对象调用 Close() 或 Dispose() 吗?