可以在构造函数中引用“this”吗?

时间:2011-02-23 07:08:28

标签: c# .net winforms constructor this

在C#中,我使用的常见模式是使用表单对象填充较低计算类的详细信息。

MyForm的构造函数是:

MyForm()
{
   _MyFormCalcs = new MyFormCalcs(this);
}

但是我今天遇到了一个错误,这让我觉得由于我的构造函数还没有完成,它会创建一个新的MyForm实例传递给MyData。因此它调用构造函数两次。我发现MyFormCalcs中的静态列表被填充两次,并且由于密钥已经存在于列表中而第二次失败。

我可以在构造函数中使用它来引用此实例吗?它在低级类中包含什么 - 是否运行了构造函数。

将表单传递给下层的更好方法是什么?

4 个答案:

答案 0 :(得分:9)

不,这不会创建MyForm的新实例。

通常,允许this从构造函数“转义”是dangerous,因为这意味着它可以在构造函数完成之前使用,但它不会创建新实例。如果你能给出你所看到的问题的简短但完整的例子,我们可以帮助进一步诊断它。特别是,你不清楚“静态列表被填充两次”是什么意思。通常,在实例构造函数中填充 static 变量并不是一个好主意。

答案 1 :(得分:2)

实际上,在构造函数中避免这样的调用真的很好,因为你的对象尚未构建(构造函数还没有完成它的工作),但你已经使用这个“未完成”的对象作为参数。这是一个糟糕的方式。好方法是创建一些特殊方法:

class MyClass
{

 var obj:SomeClass;

  public MyClass()
  {
  }

  public Init()
  {
    obj = SomeClass(this);
  }

}

答案 2 :(得分:1)

创建一个私有属性,仅在首次使用时实例化MyFormCalcs,如下所示:

public class MyForm {

  private MyFormCalcs MyFormCalcs {
    get {
      _MyFormCalcs = _MyFormCalcs ?? new MyFormCalcs(this);   
    }
  }
}

这样,您就不必考虑何时“初始化”事物。

答案 3 :(得分:0)

C#构造函数顺序有这个非常完整的响应:

C# constructor execution order