C#Form.Close与Form.Dispose


88

我是C#的新手,我尝试查看早期的文章,但没有找到一个好的答案。

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

MSDN说,在调用Close时,对象中的所有资源都是关闭的,并且该表单也被处置。尽管有这些,但我在网上还是遇到了多个示例,这些示例遵循的是Dispose而不是Close。

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


IMO的问题略有不同,答案相同:即Close和Dispose通常等效,只是您可以多次调用Close。
ChrisW

2
@Chrisw:您也可以不止一次致电Dispose。
Henk Holterman 2010年

@ ChrisW,Dispose也应该设计为不止一次运行。bluebytesoftware.com/blog/…–
史蒂文·埃弗斯

close ===而不是close == form使我得到的东西。Visible = false; 我原以为关闭将是比处理更柔和的方法。
Pete Kirkham 2010年

4
@Pete Kirkham:如果需要form.Visible = false;,可以致电form.Hide()。实际上,form.Hide()只需设置即可this.Visible = false;
Dirk Vollmar 2010年

Answers:


171

MSDN上的这个论坛告诉您。

Form.Close()发送适当的Windows消息以关闭Win32窗口。在该过程中,如果未模态显示表单,则在表单上调用Dispose。处置表单将释放表单所保留的非托管资源。

如果执行form1.Show()Application.Run(new Form1()),则将在调用when时Close()调用Dispose 。

但是,如果您form1.ShowDialog() 要模态显示该表单,则该表单将不会被处理,您需要自称form1.Dispose()。我相信这是您唯一需要担心自己处理表格的时候。


第一版是否包含引号?+1补偿。
汉克·霍尔特曼

@Dan第一个版本很烂...(对不起@Kyra)
jjnguy 2010年

13
这与MSDN在msdn.microsoft.com/zh-cn/library/…上的状态有些不同:“未将窗体放在Close上的一个条件是,它是多文档接口(MDI)的一部分。应用程序,并且表单是不可见的。在这种情况下,您将需要手动调用Dispose,以将表单的所有控件标记为垃圾回收。” 但是,应该很容易用一个简单的样本来检查模态形式是否被处理。
德克·沃尔玛


14

通常,我总是主张为任何提供该方法的类显式调用Dispose方法,方法是直接调用该方法或将其包装在“ using”块中。

通常,实现IDisposible的类这样做是因为它们包装了一些需要释放的非托管资源。虽然这些类应具有充当保护措施的终结器,但调用Dispose将有助于更早地释放该内存,并降低开销。

对于Form对象,正如Kyra的链接所指出的,记录了Close方法可以代表您调用Dispose,因此您无需明确地这样做。但是,对我而言,这始终感觉像是依赖于实现细节。我更喜欢始终为实现它们的类同时调用Close和Dispose,以防止实现更改/错误以及清楚起见。正确实现的Dispose方法应该可以安全地多次调用。



6

不打电话 Close可能绕过发送了一堆Win32消息,尽管我无法具体告诉您原因,但有人认为这很重要。

Close具有引发事件(可以取消)的好处,以便(表单)局外人可以注意FormClosingFormClosed做出相应反应。

如果您只处理表格,我不清楚是否提出FormClosing和/或FormClosed提出,但我将留给您进行试验。


2
如果处理该表单,则不会调用close和close事件。
矩阵

4
在mdi-child窗口的Modal-Form上使用时,调用Dispose方法将导致窗口闪烁
dotNETbeginner 2011年


0

Close()-托管资源可以暂时关闭,也可以再次打开。

Dispose()-永久删除托管或非托管资源


3
仅当使用显示表格时才如此ShowDialog()。否则,Close()也将配置表格。
彼得·杜尼奥

-1

如果您在窗体中使用form.close()并设置窗体的FormClosing事件,并且在此Event中使用form.close(),则您将陷入无限循环,并且发生了超出范围的争论,而解决方案是更改窗体FormClosing事件中的.close()与form.dispose()。希望这个小技巧对您有所帮助!!!


-1

我刚刚使用VS诊断工具进行的实验就是将其称为this.Close(),然后触发formclosing事件。然后,当我在Formclosing事件的末尾调用this.Dispose()并在其中放置许多其他对象时,它将更平滑地清理所有内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.