0

我想让 Windows 窗体控件只读和 IDisposable。

这是好事还是坏事?调用 Dispose 时我需要注意什么?

我有一个选项卡(PageTab),我扩展并插入了一个具有列表视图和另一个工具栏控件的面板。然后将这些选项卡插入选项卡控件(所有本机 .NET Windows 窗体控件)。

当用户关闭这些选项卡之一时,我调用 Dispose 方法(它遵循MSDN实现 IDisposable 的方式)。

将控件声明为只读(见下文)是否明智或建议?

protected readonly ListView _AccountsList = new ListView();
protected readonly Panel _Panel = new Panel();

因为在 Dispose 方法中,我只是_Panel.Dipose()在它们上调用 等,但我不能将它们设置为 null。我想尽可能避免泄漏并收集垃圾。

非设计师 GUI 开发和处置它们的最佳方式是什么?

4

2 回答 2

4

Control.Dispose 的默认实现(由 TabPage 继承)就足够了。它迭代存储在 Controls 集合成员中的子控件并调用它们的 Dispose() 方法。你不必帮忙。

只有两种情况应该显式调用 Dispose():

  • 当您从 Controls 集合中删除控件时。在这里调用 Dispose() 是一项硬性要求。不这样做将使窗口句柄在程序的生命周期内保持活动状态,它只是不可见。如果你不处理它,你就会有泄漏。
  • 当您使用 ShowDialog() 显示表单时。这绕过了表单及其子控件的正常自动处理,因此您可以回读对话框结果而不会冒 ObjectDisposed 异常的风险。using 语句是执行此操作的正确方法。

后一种情况实际上不是泄漏,Control 类的终结器确保对话框的窗口句柄最终被释放,假设没有对对话框对象的实时引用。

控制是少数忘记调用 Dispose() 会导致无法控制的资源泄漏的类之一。您是正确的,因为您必须在 TabPage 派生对象上显式调用 Dispose() 才能在删除页面时将其释放。但是您不必担心它的子控件。

于 2009-09-06T19:26:03.830 回答
1

如果选项卡正在关闭,则可能不会有任何其他引用它,因此您无需担心将值设置为 null。

为了 GC 将变量设置为 null 的唯一值是在其他情况下仍然存在对对象的实时引用的情况。这听起来不像这里的情况。

于 2009-09-06T07:03:51.120 回答