为什么编译器会在定义实例变量时初始化实例变量时发出错误信息?
关键字“this”在当前上下文中不可用
构造函数初始化很好。我理解这里的场景 - 我只想找到原因(通过MSDN或其他方式)为什么“this”可用于构造函数,但不能直接初始化成员变量。
这是我所看到的错误的简单抽象。
public class ClassA
{
// Gets compiler error that "this" unavailable
protected ClassB _a1 = new ClassB(this);
// Works fine
protected ClassB _a2;
public ClassA() { _a2 = new ClassB(this); }
}
public class ClassB
{
public ClassA A { get; private set; }
public ClassB(ClassA a) { this.A = a; }
}
我希望在分配旁边保持初始化,因为上面的例子是我的代码的抽象,我在10-15个成员变量中定义了Lazy valueFactory委托,其中委托需要将数据上下文作为参数传递给构造函数。有了15个成员变量,我宁愿将定义旁边的赋值保留在一行而不是15行定义,然后在构造函数中再初始化每行15行。
这基本上就是我在实际代码中要做的事情:
public class MyContext
{
public ProgramService Programs { get { return _programs.Value; } }
protected Lazy<ProgramService> _programs;
public MyContext()
{
_programs = new Lazy<ProgramService>(() => new ProgramService(this));
}
}
答案 0 :(得分:4)
基本上是为了避免依赖于正在构建的类的顺序(textual)和可能不可用的状态。我认为最重要的原则是,如果它是“复杂的”逻辑,那么你应该使用构造函数。
例如,这样做:
class A {
private int x = 1;
private int y = this.x + 1;
}
会导致不同的结果:
class A {
private int y = this.x + 1;
private int x = 1;
}
这有点出乎意料。为了解决问题,但仍然允许内联初始化的方便 - 禁止this
使得排序无关紧要。
在您的实际代码中,您可能会进行懒惰检查以确保位置在一起:
public ProgramService Programs {
get {
if (_programs == null) _programs = new ProgramService(this);
return _programs.Value;
}
}
// change this to private to keep subclasses from accessing a possibly null reference
private Lazy<ProgramService> _programs;