直接初始化类成员变量时,“this”不可用

时间:2015-07-28 14:26:10

标签: c# initialization this

为什么编译器会在定义实例变量时初始化实例变量时发出错误信息?

  

关键字“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));
    }
}

1 个答案:

答案 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;