C#Form.Close vs Form.Dispose
我是C#的新手,我试着看看以前的帖子,但没有找到好的答案 在具有单个窗体的C#Windows窗体应用程序中,是使用C#Form.Close vs Form.Dispose,c#,winforms,C#,Winforms,我是C#的新手,我试着看看以前的帖子,但没有找到好的答案 在具有单个窗体的C#Windows窗体应用程序中,是使用Form.Close()更好还是Form.Dispose() MSDN表示对象中的所有资源都已关闭,并且在调用关闭时释放表单。尽管如此,我还是在网上看到了几个例子,它们都是按照处置而不是结束语进行的 一个比另一个有优势吗?在哪些情况下,我们应该选择一种而不是另一种?MSDN论坛告诉您 Form.Close()发送正确的窗口 关闭win32的消息 窗户。在此过程中,如果 表单未以模式显
Form.Close()
更好还是Form.Dispose()
MSDN表示对象中的所有资源都已关闭,并且在调用关闭时释放表单。尽管如此,我还是在网上看到了几个例子,它们都是按照处置而不是结束语进行的
一个比另一个有优势吗?在哪些情况下,我们应该选择一种而不是另一种?MSDN论坛告诉您
Form.Close()
发送正确的窗口
关闭win32的消息
窗户。在此过程中,如果
表单未以模式显示,Dispose为
在表格上打电话。处理表格
释放所需的非托管资源
这张表格还在继续
如果执行form1.Show()
或
Application.Run(newform1())
,Dispose
将在调用Close()
时调用
但是,如果执行form1.ShowDialog()
要以模态方式显示窗体,窗体
不会被处置,你需要
自己调用form1.Dispose()
。我
相信这是你唯一的一次
应该担心处理表单
你自己
不调用
Close
可能会绕过发送一堆Win32消息,人们认为这些消息有点重要,尽管我无法具体告诉您原因
Close
具有引发事件(可以取消)的好处,以便外部人员(表单)可以监视FormClosing
和FormClosing
,以便做出相应的反应
我不清楚如果您只是简单地处理表单,是否会引发
FormClosing
和/或FormClosing
,但我将把这留给您进行试验。作为一般规则,我一直主张为提供该方法的任何类显式调用dispose方法,可以直接调用该方法,也可以将其包装为“使用”街区
大多数情况下,实现IDisposable的类之所以这样做,是因为它们封装了一些需要释放的非托管资源。虽然这些类应该有作为保护的终结器,但调用Dispose将有助于更早地释放内存,并降低开销
在Form对象的情况下,正如来自Kyra的链接所指出的,Close方法被记录为代表您调用Dispose,因此您不需要显式地这样做。然而,对我来说,这就像依赖于一个实现细节。我更喜欢为实现它们的类调用Close和Dispose,以防止实现更改/错误,并且为了清楚起见。正确实现的Dispose方法应该可以安全地多次调用 使用
使用是一种非常好的方法:
using (MyForm foo = new MyForm())
{
if (foo.ShowDialog() == DialogResult.OK)
{
// your code
}
}
Close()-托管资源可以临时关闭,也可以再次打开
Dispose()-如果您在表单中使用form.close()并设置表单的FormClose事件,或者使用form.close(),则永久删除托管或非托管资源。在这种情况下,您将陷入无限循环,参数超出范围,解决方案是使用form.Dispose()更改form.close()在关闭的情况下。
我希望这个小提示能帮助你 我刚刚用VS诊断工具做了一个实验,我称之为.Close(),然后触发formclosing事件。然后,当我在Formclosing事件的末尾调用此.Dispose()时,其中包含许多其他对象,它会更平滑地清理所有内容。问题略有不同,答案相同,IMO:也就是说,Close和Dispose通常是等价的,只是您可以多次调用Close。@Chrisw:您也可以多次调用Dispose。@Chrisw,Dispose也应设计为运行多次。让我知道close===dispose而不是close==form.Visible=false;我原以为close是一种比dispose更软的方法。@Pete Kirkham:If you wantform.Visible=false
您可以调用form.Hide()
。实际上,form.Hide()代码>。第1版是否包含报价+1来补偿。@Dan第一个版本很烂。。。(抱歉@Kyra)这与MSDN的声明有所不同:“表单在关闭时未被释放的一个条件是它是多文档接口(MDI)应用程序的一部分,并且表单不可见。在这种情况下,您需要手动调用Dispose来标记表单的所有控件以进行垃圾回收。”,通过一个简单的示例,应该很容易检查模态形式是否被处理。感谢您的解释。但可能需要修复链接:)如果您处理表单,则不会调用关闭和关闭事件。调用dispose方法将导致在mdi子窗口上的模式表单上使用时窗口闪烁仅当使用ShowDialog()
显示表单时才是如此。否则,Close()
也将处理该表单。