当您创建表单或用户控件时,WinForms设计器会生成一个如下所示的dispose方法:
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
此代码的问题在于,如果编辑它以处理其他对象,则可能导致错误的行为。我见过带有dispose方法的.designer.cs文件,如下所示:
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
if (_myDisposable != null)
_myDisposable.Dispose();
if (_myOtherDisposable != null)
_myOtherDisposable.Dispose();
}
base.Dispose(disposing);
}
...这是不正确的,因为_myDisposable和_myOtherDisposable的处理不应该取决于组件是否为空。
所以,忽略关于编辑这个设计器生成的代码是否是一个好习惯的论点,并忽略了你可以通过编辑模板来改变它的事实,我的问题是:为什么设计师不生成代码看起来更像这样?
protected override void Dispose(bool disposing)
{
if (disposing)
{
if(components != null)
components.Dispose();
}
base.Dispose(disposing);
}
此代码具有相同的最终结果,但更安全且在修改期间不易出错。
答案 0 :(得分:4)
答案是:因为您在微软编写此功能的主要关注点不在于此。或许他们认为你作为一名非微软员工,作为程序员可能不会有任何好处,因此,你应该远离危险的业务,例如修改对象的Dispose()方法。
顺便说一下,Dispose()方法位于.Designer.cs文件中的区域之外,该文件被指定为“不编辑此设计器生成的代码”,所以我认为可以编辑它。
答案 1 :(得分:3)
我认为这是因为微软的“官方”IDisposable
模式试图在不必要的情况下容纳太多情况。
有关详细信息,请参阅Stephen Cleary撰写的这篇优秀文章: What your mother never told you about IDisposable 。他对IDisposable
的问题以及如何解决这些问题有很深入的了解。
IDisposable
类中,其唯一目的是处置非托管资源。
如果遵循本指南,那么这种神秘的Dispose
方法就不再需要了,同时解决了微软推荐的其他一些更严重的问题。
答案 2 :(得分:1)
你最重要的是,你甚至没有提到它放在Designer.cs文件中的事实。
您必须先移动它(到MyForm.cs),然后进行编辑。有一些常识......
但它主要是学术性的, components == null仅在完全空的表单上才为真。删除1按钮或标签,问题不会出现。 击>
我刚刚检查过,即使在空的表格上也不是null
。 (好吧,显然只适用于Fx 4+)
答案 3 :(得分:1)
处理表单上包含的资源的处理的推荐方法是使用FormClosing或FormClosed事件。 UserControl具有用于相同目的的Disposed事件。