我是C#的新手,我试着查看之前的帖子,但没有找到一个好的答案。
在使用单一表单的C#Windows窗体应用程序中,更好地使用Form.Close()
还是Form.Dispose()
?
MSDN表示关闭对象中的所有资源,并在调用Close时释放表单。尽管如此,我在网上遇到了几个跟随Dispose而不是Close的例子。
一个人比另一个人有优势吗?在哪种情况下,我们应该优先选择其中一种?
答案 0 :(得分:150)
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
可以提升事件(可以取消),以便外人(对于表单)可以关注FormClosing
和FormClosed
以便做出相应的反应。< / 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()并在其中放置许多其他对象时,它将使所有内容清理得更加流畅。