使用Show()
代替Dispose()
关闭使用Close()
打开的表单时发生了什么?有人可以详细告诉我,Dispose()
方法中发生了什么?
答案 0 :(得分:6)
Close()
和Dispose()
之间的基本区别是,当调用Close()
方法时,任何受管资源都可以暂时关闭,并且可以再次打开。这意味着,使用相同的对象可以重新打开或使用资源。其中Dispose()
方法从内存中永久删除任何资源((un)托管)以进行清理,并且资源不再存在以进行任何进一步处理。
或只是一般性陈述。使用连接对象调用Close()
将释放连接回池。调用Dispose()
将调用Close()
,然后将连接字符串设置为null。
某些对象(如Stream实现IDisposable
)但Dispose方法仅在您首先将对象强制转换为IDisposable
时才可用。它确实暴露了Close()
方法。
我总是争辩说,当你完成对象时,你应该在任何实现Dispose()
的对象上调用IDisposable
。即使它什么都不做。无论如何,jit编译器将从最终代码中优化它。如果对象包含Close()
但不包含Dispose()
,请拨打Close()
。
您还可以在IDispoable
个对象
using(SqlConnection con = new SqlConnection())
{
//code...
}
当退出块时,这将在SqlConnection上调用Dispose()
。
答案 1 :(得分:3)
反复编译这两个方法(Dispose
和Close
)后来发现后者执行了两次额外检查,然后调用Dispose
,就像这样:
object[] objArray;
if (base.GetState(262144))
{
throw new InvalidOperationException(SR.GetString("ClosingWhileCreatingHandle", new object[] { "Close" }));
}
if (base.IsHandleCreated)
{
this.closeReason = CloseReason.UserClosing;
base.SendMessage(16, 0, 0);
return;
}
base.Dispose();
来自文档:
当表单关闭时,将关闭对象中创建的所有资源并处理表单。 [...] 表单未在Close上处理时的两个条件是(1)它是多文档界面(MDI)应用程序的一部分,并且表单不可见; (2)您使用ShowDialog显示了表单。在这些情况下,您需要手动调用Dispose以标记所有表单的垃圾收集控件。
希望它有所帮助。
答案 2 :(得分:1)
实际上,在这种情况下,Close()
和Dispose()
完全不同:
Close
通过发送适当的Windows消息来关闭表单。您可以使用Open()
Dispose
完全处理表单资源,您将无法再次重用表单实例。