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

本文关键字:变量 成员 初始化 this quot | 更新日期: 2023-09-27 18:05:13

为什么编译器给出一个错误,关于这是不可用的,当初始化实例变量时定义它?

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

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

基本上是为了防止您依赖于正在构建的类的顺序(文本)和可能不可用的状态。我认为最重要的原则是,如果它是"复杂"的逻辑,那么你应该使用构造函数。

class A {
   private int x = 1;
   private int y = this.x + 1;
}

将导致不同的结果:

class A {
   private int y = this.x + 1;
   private int x = 1;
}

有点出乎意料。为了避开这个问题,但仍然允许内联init的便利性-不允许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;