最近,我注意到 Visual Studio Designer (C#) 的某些行为,这些行为让我感到困惑,想知道是否有人能够澄清一下...
在我的某些 Windows Forms 上,设计器生成的代码的第一行是:
this.components = new System.ComponentModel.Container();
当出现这种情况时,在同一个设计文件中的 dispose 方法会在以下方式下将两个“Dispose”调用放置在 if 条件语句内:
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
base.Dispose(disposing);
}
}
也就是说,只有在disposing为true而且components不为null的情况下才会调用任何内容。
在某些其他窗体中,设计器生成的代码中缺少第一行。在这些情况下,base.Dispose调用位于“if”条件之外,如下所示...
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
在追踪一个表单不关闭的错误时,我注意到这一点,其中this.components为null,但是base.Dispose调用在该条件内部(我怀疑设计师代码已被篡改,但那是另一个故事。
是什么控制这种行为?
(项目中早期的一些窗体是在VS 2005中创建的,现在我们使用的是VS 2008 - 这是一个线索吗?)
(components!= null)
检查的意义是什么,如果根本没有components
初始化?谁、何时和何地初始化components
?顺便说一下,我从VS2010、.NET4.0来到这里。 - Fulproof