一个更好的Dispose方法(通过ComponentModel.IContainer ??)

时间:2011-01-05 12:12:55

标签: c# .net memory

我想要改变这个Dispose方法。 (是的,我应该检查每个对象是否为空,我知道)

    protected override void Dispose(bool disposing)
    {
        if( disposing )
        {
            if( monthLineBrush != null)
                monthLineBrush.Dispose();
            monthHeaderLineBrush.Dispose();
            shadowBrush.Dispose();
            monthHeaderLineBrushDark.Dispose();
            monthFontBrush.Dispose();
            weekendBgBrush.Dispose();
            whiteBrush.Dispose();
            dayFontBrush.Dispose();
            chartBrush.Dispose();
            chartWarningBrush.Dispose();
            barBrush.Dispose();
            monthLinePen.Dispose();
            monthHeaderLinePen.Dispose();
            monthHeaderLinePenDark.Dispose();
            warningLinePen.Dispose();
            monthFont.Dispose();
            yearFont.Dispose();
            weekLinePen.Dispose();
            dayLinePen.Dispose();
            tooltip.Dispose();
            toolTipLabel.Dispose();
        }

        base.Dispose(disposing);
    }

VS使用名为components的System.ComponentModel.IContainer对象,并且只处理此组件对象。然而,我找不到任何代码将不同的对象添加到组件objedct ??

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

这是如何运作的?

2 个答案:

答案 0 :(得分:9)

自动生成将创建的每个对象添加到components容器的代码,并将其添加到设计器与每个表单关联的*.Designer.cs文件中。

例如,一旦您向表单添加了Form1.Designer.cs控件,ToolTip文件在一个全新的空项目中看起来就像这样:

private void InitializeComponent()
{
    this.components = new System.ComponentModel.Container();
    this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
    this.SuspendLayout();
    // 
    // Form1
    // 
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    this.ClientSize = new System.Drawing.Size(284, 264);
    this.Name = "Form1";
    this.Text = "Form1";
    this.ResumeLayout(false);
}

在整个混乱中有两行相关的代码行,其中两行出现在最顶端:

this.components = new System.ComponentModel.Container();
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);

第一行创建一个名为components的{​​{3}}对象,在创建IDisposable时,将添加所有实现ToolTip的组件。

第二行创建一个IContainer对象(响应一个在设计时间内对表单的表面有药物),并使用System.ComponentModel.Container接受components类型的参数。

将相同的歌曲和舞蹈扩展到添加到表单中的其他组件,可以使用{{1}}容器提供的constructor overload一次性处理它们。

答案 1 :(得分:0)

对于谁在乎,我刚刚添加了一个" DisposeIfNotNull"方法。编写我自己的IContainer似乎有点矫枉过正,因为我也必须手动将对象添加到容器中......

    protected override void Dispose(bool disposing)
    {
        if( disposing )
        {
            DisposeIfNotNull(monthLineBrush);
            DisposeIfNotNull(monthLineBrush);
            DisposeIfNotNull(monthHeaderLineBrush);
            DisposeIfNotNull(shadowBrush);
            DisposeIfNotNull(monthHeaderLineBrushDark);
            DisposeIfNotNull(monthFontBrush);
            DisposeIfNotNull(weekendBgBrush);
            DisposeIfNotNull(whiteBrush);
            DisposeIfNotNull(dayFontBrush);
            DisposeIfNotNull(chartBrush);
            DisposeIfNotNull(chartWarningBrush);
            DisposeIfNotNull(barBrush);
            DisposeIfNotNull(monthLinePen);
            DisposeIfNotNull(monthHeaderLinePen);
            DisposeIfNotNull(monthHeaderLinePenDark);
            DisposeIfNotNull(warningLinePen);
            DisposeIfNotNull(monthFont);
            DisposeIfNotNull(yearFont);
            DisposeIfNotNull(weekLinePen);
            DisposeIfNotNull(dayLinePen);
            DisposeIfNotNull(tooltip);
            DisposeIfNotNull(toolTipLabel);
        }

        base.Dispose(disposing);
    }

    private void DisposeIfNotNull(IDisposable objToDispose)
    {
        if (objToDispose != null)
            objToDispose.Dispose();
    }