C#Form.Close vs Form.Dispose

时间:2010-06-22 21:41:34

标签: c# winforms

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

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

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

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

7 个答案:

答案 0 :(得分:150)

MSDN上的

This论坛告诉你。

  

Form.Close()发送正确的Windows   要关闭win32的消息   窗口。在那个过程中,如果   表单没有以模态显示,Dispose是   呼吁表格。处理表格   释放出来的非托管资源   形式坚持下去。

     

如果您执行form1.Show()或   Application.Run(new Form1()),弃置   将在调用Close()时调用。

     

但是,如果你做form1.ShowDialog()   以形式,形式显示表格   不会被处置,你需要   自己打电话给form1.Dispose()。一世   相信这是你唯一的一次   应该担心处理表格   自己。

答案 1 :(得分:14)

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

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

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

答案 2 :(得分:5)

不调用Close可能绕过发送一堆Win32消息,人们认为这些消息有些重要但我无法明确告诉你原因......

Close可以提升事件(可以取消),以便外人(对于表单)可以关注FormClosingFormClosed以便做出相应的反应。< / p>

如果您只是处理表单,我不清楚FormClosing和/或FormClosed是否会被提出,但我会留给您试验。

答案 3 :(得分:1)

使用using是一个非常好的方式:

using (MyForm foo = new MyForm())
{
    if (foo.ShowDialog() == DialogResult.OK)
    {
        // your code
    }
}

答案 4 :(得分:1)

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

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

答案 5 :(得分:-1)

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

答案 6 :(得分:-1)

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

相关问题