使用dispose()方法而不是close()方法来表单

时间:2011-09-24 10:02:28

标签: winforms

使用Show()代替Dispose()关闭使用Close()打开的表单时发生了什么?有人可以详细告诉我,Dispose()方法中发生了什么?

3 个答案:

答案 0 :(得分:6)

Close()Dispose()之间的基本区别是,当调用Close()方法时,任何受管资源都可以暂时关闭,并且可以再次打开。这意味着,使用相同的对象可以重新打开或使用资源。其中Dispose()方法从内存中永久删除任何资源((un)托管)以进行清理,并且资源不再存在以进行任何进一步处理。


或只是一般性陈述。使用连接对象调用Close()将释放连接回池。调用Dispose()将调用Close(),然后将连接字符串设置为null。

某些对象(如Stream实现IDisposable)但Dispose方法仅在您首先将对象强制转换为IDisposable时才可用。它确实暴露了Close()方法。

我总是争辩说,当你完成对象时,你应该在任何实现Dispose()的对象上调用IDisposable。即使它什么都不做。无论如何,jit编译器将从最终代码中优化它。如果对象包含Close()但不包含Dispose(),请拨打Close()

您还可以在IDispoable个对象

上使用using语句
using(SqlConnection con = new SqlConnection())
{
    //code...
}

当退出块时,这将在SqlConnection上调用Dispose()

答案 1 :(得分:3)

反复编译这两个方法(DisposeClose)后来发现后者执行了两次额外检查,然后调用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完全处理表单资源,您将无法再次重用表单实例。