C# 更好的处理方法(通过ComponentModel.IContainer??)
我有这个处置方法,我想改变。(是的,我应该检查每个对象是否为空,我知道) VS使用名为components的System.ComponentModel.IContainer对象,并且仅处理此components对象。但是,我找不到任何将不同对象添加到组件objedct中的代码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)
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();
}