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

时间:2014-04-03 19:04:35

标签: c# .net vb.net

我正在使用.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)"表格会被处理掉表格上的按钮?当我打电话给#34; Dispose()"我试图找到一条规则。当我不需要致电" Dispose" (因为它将被隐含地处理)......

3 个答案:

答案 0 :(得分:4)

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

调用类似ShowDialog的方法并不会处置该对象,即使它看起来像是一次性操作。即使您不再使用该对象,也可能在用户关闭后要使用该信息。

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:1)

来自MSDN: Form.Dispose Method (Boolean)

  

如果使用Show方法显示表单,将自动调用Dispose。如果使用其他方法(如ShowDialog),或者表单根本不显示,则必须在应用程序中调用Dispose。