nam*_*los 4 c# dispose winforms
在Visual Studio 2008中创建一个新的Windows窗体应用程序,这将创建一个名为"Form1"的类的骨架项目.VS2008自动创建Dispose()方法.
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
Run Code Online (Sandbox Code Playgroud)
我徘徊在一个同事办公室(一个高级开发人员) - 好人,聪明,良好的聊天设计技巧 - 但我注意到他正在输入的内容 - 因为他导航了代码库,他删除了VS2008创建的Dispose()方法的这一部分对于表格.
if (disposing && (components != null))
{
components.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
所以,我问他为什么,他说没有必要保留它.
不,删除此代码是不安全的.为了正确释放它们所持有的非托管资源,有几个组件依赖于这种模式.如果您删除此代码,您的应用程序可能会在95%的时间内正常工作.但是,5%的案例会显示为资源泄漏,可能是内存泄漏,非确定性错误......总的来说,很难追查问题.
处理可支配资源的最佳方法是在您不再使用它的瞬间处置.遵循这种做法将为您节省许多麻烦.删除此代码采用完全相反的方法.
这篇关于SO的帖子包含了更详细的解释:我什么时候应该在.NET中处理我的对象?
如果你有可能在表单上使用类似System.Windows.Forms.Timer的东西,那么绝对不要删除它.并且始终存在这种可能性.
这个代码将在表单关闭时处理计时器,如果你不处理计时器,它将继续运行.我已经接管了几个代码,这些代码已经引入了这种类型的bug(在.NET 2.0之前,这种机制不能很好地工作),并且由于定时器在应该更新的表单之后运行很久而导致的间歇性性能问题已经关闭可能是一个真正的痛苦.
删除它没有任何实际好处 - 如果没有控件将自己添加到组件列表中,那么components.Dispose()将很容易运行.如果控件已经将自己添加到列表中那么那是因为它们应该被处理掉.