为什么WinForms设计师会产生一些不方便的'处理方法中的代码?

时间:2012-01-09 19:35:29

标签: c# winforms visual-studio

当您创建表单或用户控件时,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);
    }

此代码具有相同的最终结果,但更安全且在修改期间不易出错。

4 个答案:

答案 0 :(得分:4)

答案是:因为您在微软编写此功能的主要关注点不在于此。或许他们认为你作为一名非微软员工,作为程序员可能不会有任何好处,因此,你应该远离危险的业务,例如修改对象的Dispose()方法。

顺便说一下,Dispose()方法位于.Designer.cs文件中的区域之外,该文件被指定为“不编辑此设计器生成的代码”,所以我认为可以编辑它。

答案 1 :(得分:3)

我认为这是因为微软的“官方”IDisposable模式试图在不必要的情况下容纳太多情况。

有关详细信息,请参阅Stephen Cleary撰写的这篇优秀文章: What your mother never told you about IDisposable 。他对IDisposable的问题以及如何解决这些问题有很深入的了解。

Stephen提供了一个简单的指导原则:只是不要在一个类中混合托管和非托管资源;相反,将每个非托管资源包装在IDisposable类中,其唯一目的是处置非托管资源。

如果遵循本指南,那么这种神秘的Dispose方法就不再需要了,同时解决了微软推荐的其他一些更严重的问题。

答案 2 :(得分:1)

你最重要的是,你甚至没有提到它放在Designer.cs文件中的事实。

您必须先移动它(到MyForm.cs),然后进行编辑。有一些常识......

但它主要是学术性的, components == null仅在完全空的表单上才为真。删除1按钮或标签,问题不会出现。

我刚刚检查过,即使在空的表格上也不是null。 (好吧,显然只适用于Fx 4+)

答案 3 :(得分:1)

处理表单上包含的资源的处理的推荐方法是使用FormClosing或FormClosed事件。 UserControl具有用于相同目的的Disposed事件。