在C#中,我使用的常见模式是使用表单对象填充较低计算类的详细信息。
MyForm的构造函数是:
MyForm()
{
_MyFormCalcs = new MyFormCalcs(this);
}
但是我今天遇到了一个错误,这让我觉得由于我的构造函数还没有完成,它会创建一个新的MyForm实例传递给MyData。因此它调用构造函数两次。我发现MyFormCalcs中的静态列表被填充两次,并且由于密钥已经存在于列表中而第二次失败。
我可以在构造函数中使用它来引用此实例吗?它在低级类中包含什么 - 是否运行了构造函数。
将表单传递给下层的更好方法是什么?
答案 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#构造函数顺序有这个非常完整的响应: