在Winforms上设置控件

时间:2010-01-29 15:58:02

标签: c# winforms

为什么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);
        }

4 个答案:

答案 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。您甚至可以在这些情况下对其进行评论。对我来说听起来像是一个小笨蛋。