是否可以重用.NET WinForms Form对象?

时间:2009-01-13 17:56:20

标签: .net winforms

一旦窗口关闭,建议重用该窗口的Form实例以再次显示同一窗口?或者,当您要显示窗口时,是否需要或建议始终创建一个全新的类实例。

这真正归结为在同一个对象上多次调用Show()或ShowDialog()是一个好主意,只要窗口在两者之间关闭。

如果不建议这样做,也可以理解对基本原因的解释。

3 个答案:

答案 0 :(得分:8)

不,不。

对Close的调用最终会调用Dispose,并且该对象被视为已丢弃。

隐藏表单然后再次显示它没有问题,但是关闭它是一个明确的禁忌,因为状态在处理之后是未定义的(好的,状态被处理掉) ,但使用它与使用未定义的东西相同。

答案 1 :(得分:2)

在我看来,这个想法违反了三个原则:(1)避免过早优化,(2)最小意外原则,(3)将数据与用户界面紧密耦合。

看来你正在优化时间,但需要多少时间?如果显示有问题的表格是非常耗费时间或资源的话,那么,是的,做你建议的事情可能并不坏。但一般来说,当用户界面不再需要它时,创建窗口并销毁它的模式是经过时间考验的实践。此外,当窗口不可见时,它仍然占用内存。如果该窗口依赖于文件句柄或数据库连接之类的东西,那么这就是潜在的错误来源。

最小惊喜的原则意味着以期望的方式为系统的所有用户(包括最终用户,维护者和开发人员)执行操作。你所描述的模式是不寻常的,因此可能会导致更多的问题而不是它的价值。

避免这种做法的另一个原因是它违反了广泛使用的模型 - 视图 - 控制器设计模式的精神,它将对象本身与显示或修改对象的任务分开。使用这种设计模式有很好的理由,即使你不这样做,它背后的哲学也是一个很好的理念。对象的存在通常不依赖于某个用户界面对象,因此应与用户界面分开存在。例如,无论是否显示与该客户相关的窗口,都存在Customer对象。将数据与用户界面对象紧密耦合通常会导致脆弱,难以更改的代码。

如果您决定实现这一点,我建议不要创建太多这些可隐藏的窗口并尝试将它们保持在最低限度,在这种情况下,Michael Buen的代码似乎是解决问题的优雅方法。

答案 2 :(得分:1)

当您处理Windows窗体时,总是创建新实例。将大量隐藏状态打包到表单中并在第2次,第3次或第N次调用时突然创建不可预见的用户体验非常容易。根据我的经验,随着更多控件和表示代码添加到表单中,此效果会显着增加。

将表单实例重用与纳粹级别的MVC分离相结合,您需要一个主要的WTF时刻,通常是在功能测试期间。