我正在使用C#中的.NET 2.0 WinForms应用程序。
我注意到在我的应用程序拆除过程中我认为有些奇怪。在设计器生成的dispose方法中:
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
当disposing = false
确实包含某些项目时,我看到它传入components
参数的情况。这使我相信这些资源没有得到正确/释放,因为components.Dispose();
没有被调用。这是不可取的行为吗?
感谢。
答案 0 :(得分:4)
如果从终结器调用disposing
,则Dispose(bool)
参数将作为false传递。通常,这会在未调用Dispose()
时发生。
Dispose(bool)
方法实际上不是IDisposable的一部分;它由IDisposable.Dispose()
和Object.Finalize()
使用。惯例是IDisposable.Dispose()
将致电Dispose(true)
,Object.Finalize()
将致电Dipose(false)
。
答案 1 :(得分:1)
也许你的班级需要处理非托管资源,因此也会实现终结器?
这样的事情:
~MyForm()
{
this.Dispose(false);
}
答案 2 :(得分:1)
如果在最终确定期间调用Dispose(false)
,那么它本身就很好。如果正在最终确定表单,则包含的控件也将位于终结队列中,并且对它们调用Dispose()至少是多余的。
但是Form最终确定的事实意味着没有对它进行确定性的Dispose(),并且应该调查它本身。除非在应用程序关闭时发生这种情况,正如您所述。然后它是无害的。