为什么Visual Studio会将此代码添加到Class.Designer.cs分部类中。 任何人都能告诉我这个组件变量什么时候会得到一些价值?这里的模式是什么?
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if(disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
答案 0 :(得分:5)
私有字段components
用于跟踪表单上的一次性组件。尝试拖动Timer
组件,您应该在设计器生成的代码中看到类似的内容:
this.components = new System.ComponentModel.Container();
this.timer1 = new System.Windows.Forms.Timer(this.components);
Dispose(bool)
方法中显示的模式通常称为the disposable pattern。基本上,即使您从未明确调用Dispose
方法,该模式也可确保处理所有跟踪的组件,在这种情况下,表单的基类将在其终结器中调用Dispose
方法(在垃圾收集期间)。
答案 1 :(得分:5)
它是由表单项模板生成的代码(common7 \ ide \ itemtemplates \ csharp \ windows forms \ 1033 \ form.zip \ form.designer.cs)。它实际上有一个bug,它包含的InitializeComponent()方法不必要地初始化“this.components”变量。如果表单没有任何组件,您可以安全地从代码中删除该语句。如果稍后添加组件,设计人员会自动将其放回。
另一件不太好的事情是将Dispose()方法放在Designer.cs文件中。它确实属于form.cs文件,因此您可以为表单中应该处理的字段添加Dispose()调用。不要犹豫,自己移动代码,以这种方式修改设计器文件没有任何令人不快的副作用。请远离使用“生成代码”区域括起来的代码。
正如大多数其他答案中所提到的,当表单关闭时,此代码必须调用您在表单上放置的任何组件的Dispose()方法。表格上的控件也需要处理,但这是自动的。 Form类通过迭代Controls集合来找回它们。
答案 2 :(得分:1)
components
,这些组件也需要以确定的方式处理(有关更多信息,请参阅IDisposable模式)。
答案 3 :(得分:0)
并非所有组件都使用它 - 例如HelpProvider和EventLog。您甚至可以在这些情况下对其进行评论。对我来说听起来像是一个小笨蛋。