为什么WinForms设计器在其dispose方法中产生一些"不方便"的代码?

Mar*_*ill 5 c# visual-studio winforms

当您创建表单或用户控件时,WinForms设计器生成一个如下所示的dispose方法:

    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }
Run Code Online (Sandbox Code Playgroud)

此代码的问题在于,如果编辑它以处理其他对象,则可能导致错误的行为.我见过带有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);
    }
Run Code Online (Sandbox Code Playgroud)

...这是不正确的,因为_myDisposable和_myOtherDisposable的处理不应该取决于组件是否为空.

所以,忽略关于编辑这个设计器生成的代码是否是一个好习惯的争论,并忽略了你可以通过编辑模板来改变它的事实,我的问题是:为什么设计师不会生成看起来更像的代码这个?

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            if(components != null)
                components.Dispose();
        }
        base.Dispose(disposing);
    }
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*kis 5

答案是:因为您的方便不是 Microsoft 编写此功能的人的主要关注点。或者,他们可能认为您作为非 Microsoft 员工,不可能成为一名优秀的程序员,因此,您可能应该远离诸如修改对象的 Dispose() 方法之类的风险业务。

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