代码之家  ›  专栏  ›  技术社区  ›  Stuart Helwig

为什么VisualStudioIDE有时会初始化“this.components”对象,而有时不会?

  •  11
  • Stuart Helwig  · 技术社区  · 17 年前

    我最近注意到VisualStudio Designer(C#)的一些行为,我不明白,想知道是否有人可以澄清。。。

    this.components = new System.ComponentModel.Container();
    

    在这种情况下,dispose方法在同一设计器文件中,dispose方法在case“if”条件下放置两个“dispose”调用,如下所示:;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
                base.Dispose(disposing);
            }
        }
    

    i、 e.除非disposing为true,且components不为null,否则不会调用任何内容。

    在其他一些表单上,设计器生成的代码中的第一行丢失。在这些情况下,base.Dispose调用本身不在“if”条件下。。。

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
    

    是什么控制了这种行为?

    4 回复  |  直到 17 年前
        1
  •  5
  •   Ofer Zelig Tom    13 年前

    这是可复制的行为。创建新表单时,它从包含this.components构造函数调用的框架开始。然后,当您添加一个组件(比如一个计时器)并再次删除它时,设计器将重新生成代码,现在不需要构造函数调用。那不是虫子。

    Fwiw,骨架代码由 Common7\IDE\ItemTemplates\CSharp\Windows Forms\1033\Form.zip\form.designer.cs

    在if()语句中看到base.Dispose()调用是一个错误。这可能是自我诱导的。或者它可能是框架代码的测试版。VS2005做得很好。请检查ItemsTemplatesCache文件夹。

        2
  •  4
  •   Tom Mayfield    10 年前

    6年后,这个问题仍然存在。我已经找到了至少一个原因。

    如果你的项目经常发生这种情况,那就有一个非常糟糕的解决办法。加上这个 VB C# VisualStudioWorkaroundSerializer 根据您的解决方案初始化。然后添加属性 DesignerSerializer(GetType(VisualStudioWorkaroundSerializer), GetType(CodeDomSerializer))

        3
  •  1
  •   Marc Gravell    17 年前

    但是,在VS2008中,它生成的版本无疑是正确的:

    if (disposing && (components != null))
    {
        components.Dispose();
    }
    base.Dispose(disposing);
    

    那么基地呢 Dispose(...)

    private System.ComponentModel.IContainer components = null;
    

    然后 如果 InitializeComponent :

    private void InitializeComponent()
    {
        this.components = new System.ComponentModel.Container();
        //...
    }
    

    我猜这个构造只需要保持 初始化组件

        4
  •  0
  •   David Wengier    17 年前

    我看到过这种情况,而且我偶尔也会从Dispose方法中得到警告,关于组件从未分配其值或未定义。

    1. Visual Studio版本之间的代码生成略有不同
    2. 仅当文件中没有Dispose方法时,才会生成Dispose方法,而每次都会生成InitializeComponent(以及相关的声明)