我正在使用.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" (因为它将被隐含地处理)......
答案 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。