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