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

Run*_*CMD 2 .net c# memory

我有这个我想改变的Dispose方法.(是的,我应该检查每个对象为null,我知道)

    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);
    }
Run Code Online (Sandbox Code Playgroud)

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

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

这是如何运作的 ?

Cod*_*ray 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);
}
Run Code Online (Sandbox Code Playgroud)

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

this.components = new System.ComponentModel.Container();
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
Run Code Online (Sandbox Code Playgroud)

第一行创建一个System.ComponentModel.Container名为的对象components,IDisposable在创建它们时将添加所有实现的组件.

第二行创建一个ToolTip对象(响应在设计时对表单的表面施加药物),并使用接受类型参数的构造函数重载IContainer.

将相同的歌曲和舞蹈扩展到添加到表单中的其他组件,可以使用容器提供的Dispose方法一次性处理它们components.

  • @Run CMD:你是对的; 我这么回答得太快了.不,您无法添加这些对象.但是没有什么可以阻止你创建自己的自定义`Collection <IDisposable>`并提供一个公共`Dispose`方法,它迭代集合中的所有对象并调用它们的`Dispose`方法.我愿意打赌(虽然还不足以实际启动Reflector)这与"ComponentModel.Container"正在做的事情差不多. (2认同)