2009-09-06 70 views
0

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

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

我有一个Tab(PageTab),我扩展并插入一个具有listview和另一个工具栏控件的面板。这些选项卡然后插入到选项卡控件(所有本机.NET Windows窗体控件)中。

当用户关闭其中一个选项卡时,我会调用Dispose方法(它遵循MSDN实现IDisposable的方法)。

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

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

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

非Designer GUI开发和处理它们的最佳方式是什么?

回答

4

Control.Dispose的默认实现(由TabPage继承)是非常充分的。它迭代存储在Controls集合成员中的子控件,并调用它们的Dispose()方法。你不需要帮忙。

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

  • 当您删除从控件集合控制。在这里调用Dispose()是一个很难的要求。不这样做会使窗口句柄在程序的整个生命周期中保持活动状态,但它不可见。如果你不处理它,你会有泄漏。
  • 当您使用ShowDialog()显示窗体时。这绕过了窗体及其子控件的正常自动处理,这样就可以读取对话结果而不会冒着ObjectDisposed异常的风险。使用声明是正确的方法。

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

控件是其中几个类忘记调用Dispose()实际上可能导致不可控制的资源泄漏。您是正确的,因为您必须在TabPage派生对象上显式调用Dispose()以在删除页面时对其进行处理。但是你不必担心它的子控件。

+0

感谢您的信息!从来没有处理控制.. – GorillaApe 2011-08-13 00:23:09

1

如果该选项卡被关闭,那么可能不会有任何其他引用,因此您不必担心将值设置为空。

为了GC而将变量设置为空的唯一值是,否则仍然是对象的实时引用。这听起来不像这种情况。