C# 更好的处理方法(通过ComponentModel.IContainer??)

C# 更好的处理方法(通过ComponentModel.IContainer??),c#,.net,memory,C#,.net,Memory,我有这个处置方法,我想改变。(是的,我应该检查每个对象是否为空,我知道) VS使用名为components的System.ComponentModel.IContainer对象,并且仅处理此components对象。但是,我找不到任何将不同对象添加到组件objedct中的代码 protected override void Dispose(bool disposing) { if (disposing && (components != null)

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

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

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

这是如何工作的?

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

例如,将
工具提示
控件添加到表单后,全新的空项目中的
Form1.Designer.cs
文件可能与此类似:

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
的对象,所有实现
IDisposable
的组件在创建时都将添加到该对象中

第二行创建一个
工具提示
对象(响应于一个对象在设计时被放置在窗体表面),并使用一个接受类型为
IContainer
的参数


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

不管怎样,我刚刚添加了一个“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();
    }

好的,谢谢你的解释,我现在明白了。但是,我无法将画笔、钢笔或字体添加到容器??这将是非常无用的…我不这样认为,你想添加到容器的对象需要实现IComponent。。。在添加画笔或画笔时,您会出现“添加的最佳重载匹配(Icomponent)有一些无效参数”错误…@Run CMD:your's right;我那样回答太快了。不,不能添加这些对象。但是没有什么可以阻止您创建自己的自定义
集合
,并提供一个公共
Dispose
方法,该方法迭代集合中的所有对象并调用它们的
Dispose
方法。我愿意打赌(虽然还不足以点燃Reflector),这与
ComponentModel.Container
所做的事情几乎是一样的。我同意,定制容器对您来说可能有些过分了。真正的问题可能是你为什么要把所有的刷子和钢笔都留在记忆里?动态地创建和处理它们足够便宜,只需在
Paint
事件处理程序中即可。通过创建一次并尝试缓存,您确实没有节省太多。是的,您是100%正确的。我会更新代码。谢谢你的帮助!:-)
    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();
    }