WinForms - 何时调用 Dispose?什么时候是隐含的

本文关键字:什么时候 何时 调用 Dispose WinForms | 更新日期: 2023-09-27 17:56:24

我正在使用.NET MemoryProfiler在我的应用程序中查找内存泄漏,我似乎无法弄清楚在创建和显示winforms时何时应该调用Dispose()的模式。似乎当我这样做时

Form frm = new SomeForm();
frm.ShowDialog();
bool test = frm.IsDisposed()

测试是"假",这让我感到惊讶,.NET MemoryProfiler也确认表单没有正确处理。我想如果我"关闭(X)"对话框,那么它会有效地调用.表单上的 Dispose(),但似乎并非如此。我很好奇如果我这样做会发生什么:

Form frm = new SomeForm();
frm.Show();

当我单击表单上的"关闭(X)"按钮时,表单会被处理掉吗?我试图找到一个规则,什么时候我应该调用"Dispose()",什么时候我不需要调用"Dispose"(因为它将被隐式处置)......

WinForms - 何时调用 Dispose?什么时候是隐含的

通常,您负责处理您创建的任何一次性对象。他们不会处置自己。

调用像 ShowDialog 这样的方法不会释放对象,即使它看起来像是一次性操作。即使您不打算再次使用该对象,其中也可能有您希望在用户关闭该对象后使用的信息。

但是,调用 Show 方法是另一回事。一旦你展示了表格,它就会一直存在到它被关闭,并且实际上会自行处理。

来自 MSDN: Form.Dispose Method (Boolean):

如果使用 Show 方法显示窗体,则将自动调用 Dispose。如果使用了其他方法(如 ShowDialog),或者窗体从未显示,则必须在应用程序中调用"自行释放"。

当一个类实现IDisposable时,这意味着你被迫处置它,除非其他人负责管理对象的生命周期。

在您的情况下,您的代码应如下所示:

using(Form frm = new SomeForm())
{
    frm.ShowDialog();
}

您的"关闭按钮"关闭整个对话框,但隐藏整个表单不会释放用于绘制和/或处理 GUI 的低级资源。