C#Form.Close vs Form.Dispose

top*_*ard 79 c# winforms

我是C#的新手,我试着查看之前的帖子,但没有找到一个好的答案.

在单个表单的C#Windows窗体应用程序中,使用Form.Close()更好还是Form.Dispose()

MSDN表示关闭对象中的所有资源,并在调用Close时处理该表单.尽管如此,我在网上遇到了几个跟随Dispose而不是Close的例子.

一个人比另一个人有优势吗?在哪种情况下,我们应该优先选择其中一种?

Kyr*_*yra 156

MSDN上的这个论坛告诉你.

Form.Close()发送正确的Windows消息以关闭win32窗口.在此过程中,如果表单未以模态方式显示,则在表单上调用Dispose.处理表单会释放表单所持有的非托管资源.

如果你做一个form1.Show()Application.Run(new Form1()),调用时Close()会调用Dispose .

但是,如果您form1.ShowDialog() 要以模式方式显示表单,则表单将不会被处理,您需要form1.Dispose()自己调用.我相信这是你唯一一次担心自己处理表格.

  • 这与MSDN状态有点不同于http://msdn.microsoft.com/en-us/library/system.windows.forms.form.close%28VS.80%29.aspx:"当一个条件时如果它是多文档界面(MDI)应用程序的一部分,则表单不处于关闭状态,并且表单不可见.在这种情况下,您需要手动调用Dispose以标记所有表单的垃圾收集控件".但是,应该很容易通过简单的样本检查模态形式是否被处置. (12认同)

Jes*_*ire 14

作为一般规则,我总是主张通过直接调用方法或包装在"using"块中为任何提供它的类显式调用Dispose方法.

大多数情况下,实现IDisposible的类是这样做的,因为它们包装了一些需要释放的非托管资源.虽然这些类应该具有作为安全措施的终结器,但调用Dispose将有助于更早地释放内存并降低开销.

对于Form对象,作为Kyra指出的链接,记录了Close方法以代表您调用Dispose,因此您无需明确地这样做.然而,对我来说,这总是感觉像依赖于实施细节.我更喜欢总是为实现它们的类调用Close和Dispose,以防止实现更改/错误并且为了清楚起见.正确实现的Dispose方法应该可以安全地多次调用.


Red*_*dog 6

不调用Close可能绕过发送一串哪一个会想到的,虽然我不能具体告诉你为什么有些重要的Win32消息...

Close具有提高活动的好处(可以取消),使得局外人(窗体)可以观看FormClosing,并FormClosed以相应的反应.

我不清楚是否FormClosing和/或FormClosed如果你只是处理的形式,但我把它留给你做实验的提高.

  • 当在Modal-Form上使用mdi-child窗口时,调用Dispose方法会导致窗口闪烁 (4认同)
  • 如果您处置表单,则不会调用关闭和关闭的事件. (2认同)