为什么WinForms设计器会生成一些';不方便';其dispose方法中的代码

本文关键字:不方便 方法 代码 dispose WinForms 为什么 | 更新日期: 2023-09-27 18:19:47

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

    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

此代码的问题在于,如果对其进行编辑以处理其他对象,则可能会导致不正确的行为。我看到了.designer.cs文件的dispose方法如下所示:

    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的处理不应取决于组件是否为null。

因此,忽略关于编辑设计师生成的代码是否是一种好做法的争论,忽略你可以通过编辑模板来更改它的事实,我的问题是:为什么设计师不生成看起来更像这样的代码?

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            if(components != null)
                components.Dispose();
        }
        base.Dispose(disposing);
    }

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

为什么WinForms设计器会生成一些';不方便';其dispose方法中的代码

答案是:因为无论是谁在微软编写这个函数,都不关心你的方便。或者他们认为,作为一名非微软员工,你不可能成为一名优秀的程序员,因此,你可能应该远离风险业务,例如修改对象的Dispose()方法。

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

我认为这是因为微软的;官方的";IDisposable模式试图适应太多不必要的情况。

有关更多详细信息,请参阅Stephen Cleary的这篇精彩文章:[你母亲从未告诉过你的IDisposable]https://www.codeproject.com/Articles/29534/IDisposable-What-Your-Mother-Never-Told-You-About)。他对IDisposable的问题以及如何解决这些问题有一些很好的见解。

Stephen提供了一条简单的准则:不要在一个类中混合托管和非托管资源;相反,将每个非托管资源包装在IDisposable类中,该类的唯一目的是处理该非托管资源。

如果遵循这一准则,那么这种晦涩难懂的Dispose方法就不再是必要的了,同时也解决了微软推荐模式中的一大堆其他更严重的问题。

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

你基本上是对的,你甚至没有提到它被放在Designer.cs文件中的事实。

你必须先把它移到MyForm.cs,然后再编辑它。。。

但这在很大程度上是学术性的,components==null只有在一个完全空的表单上才会成立。点击1个按钮或标签,问题就不会出现

我刚刚查了一下,即使在一张空表上,它也不是null。(好的,显然只是Fx4+)