我刚接触C#,查看了之前的帖子但没有找到一个好的答案。
在一个只有一个窗体的C# Windows Form应用程序中,使用Form.Close()
还是Form.Dispose()
更好?
MSDN说当调用Close时,对象内的所有资源都将被关闭并且窗体将被处理。尽管如此,我在网上还遇到了许多示例使用Dispose而不是Close。
这两种方法有什么优劣势?我们应该在哪些情况下优先考虑其中一种方法?
这个MSDN论坛可以告诉你。
Form.Close()
发送正确的Windows消息以关闭win32窗口。在此过程中,如果该窗体未以模态方式显示,则会调用Dispose以释放窗体持有的非托管资源。如果执行
form1.Show()
或Application.Run(new Form1())
,则当调用Close()
时,将调用Dispose
。但是,如果您使用
form1.ShowDialog()
以模态方式显示窗体,则窗体不会被释放,您需要自行调用form1.Dispose()
。我认为这是您唯一需要自行处理窗体释放的情况。
不调用Close
可能会绕过发送一堆Win32消息,这些消息似乎非常重要,但我无法具体告诉您为什么...
Close
的好处是它会引发事件(可以取消),以便外部人员(对于表单)可以观察FormClosing
和FormClosed
,并相应地做出反应。
我不清楚是否在仅处理表单时引发FormClosing
和/或FormClosed
,但我将让您进行实验。
这是一个老问题,有一些好的答案,但我想分享一个清晰的答案来回答这个非常流行的问题。
您是使用 Show
打开的窗体吗?
那么,在代码中关闭它,只需调用 Close()
。
您是使用 ShowDialog
打开的窗体吗?
那么,通过设置 DialogResult
或调用 Close
来关闭它。
你是用 Show
打开了这个窗体吗?
不需要。当你通过 Close
或点击 X 关闭窗体时,它会自动释放。
你是用 ShowDialog
打开了这个窗体吗?
是的,你需要。当你通过 Close
、设置 DialogResult
或点击 X 关闭窗体时,如果你不打算重复使用这个窗体,你需要显式调用 Dispose
,或者确保你在一个 using
块中创建窗体实例,像这样:
//form will be disposed after the using block
using (var f = new MyForm())
{
if (f.ShowDialog() == DialogResult.OK)
{
//Your logic to handle OK here
}
}
如果你想稍后重复使用它,那么在不再需要它时不要忘记显式地 Dispose
。
using
是一个相当不错的方式:using (MyForm foo = new MyForm())
{
if (foo.ShowDialog() == DialogResult.OK)
{
// your code
}
}
Close() - 可以暂时关闭托管资源,并可以再次打开。
Dispose() - 永久删除托管或非托管资源
ShowDialog()
方法显示窗体时,这种说法才是正确的。否则,Close()
方法也会同时释放该窗体。 - Peter Duniho
form.Visible = false;
,你可以调用form.Hide()
。实际上,form.Hide()
只是将this.Visible = false;
设置为了隐藏窗体。 - Dirk Vollmar