Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Form.Close vs Form.Dispose_C#_Winforms - Fatal编程技术网

C#Form.Close vs Form.Dispose

C#Form.Close vs Form.Dispose,c#,winforms,C#,Winforms,我是C#的新手,我试着看看以前的帖子,但没有找到好的答案 在具有单个窗体的C#Windows窗体应用程序中,是使用Form.Close()更好还是Form.Dispose() MSDN表示对象中的所有资源都已关闭,并且在调用关闭时释放表单。尽管如此,我还是在网上看到了几个例子,它们都是按照处置而不是结束语进行的 一个比另一个有优势吗?在哪些情况下,我们应该选择一种而不是另一种?MSDN论坛告诉您 Form.Close()发送正确的窗口 关闭win32的消息 窗户。在此过程中,如果 表单未以模式显

我是C#的新手,我试着看看以前的帖子,但没有找到好的答案

在具有单个窗体的C#Windows窗体应用程序中,是使用
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 want
form.Visible=false
您可以调用
form.Hide()
。实际上,
form.Hide()。第1版是否包含报价+1来补偿。@Dan第一个版本很烂。。。(抱歉@Kyra)这与MSDN的声明有所不同:“表单在关闭时未被释放的一个条件是它是多文档接口(MDI)应用程序的一部分,并且表单不可见。在这种情况下,您需要手动调用Dispose来标记表单的所有控件以进行垃圾回收。”,通过一个简单的示例,应该很容易检查模态形式是否被处理。感谢您的解释。但可能需要修复链接:)如果您处理表单,则不会调用关闭和关闭事件。调用dispose方法将导致在mdi子窗口上的模式表单上使用时窗口闪烁仅当使用
ShowDialog()
显示表单时才是如此。否则,
Close()
也将处理该表单。