我想要改变这个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);
}
这是如何运作的?
答案 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();
}