C# - 为什么在字段初始值设定项中无法访问'this'?

Vil*_*lx- 3 c# constructor

为什么会产生编译器错误:

class Foo
{
    public Bar Baz = new Bar(this);
}
Run Code Online (Sandbox Code Playgroud)

但这不是:

class Foo
{
    public Bar Baz;

    public Foo()
    {
        this.Baz = new Bar(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

从概念上讲,这两者是等价的,不是吗?

Jon*_*eet 10

不,它们不完全等效......变量初始化程序运行任何基类构造函数之前执行.构造函数的主体在运行基类构造函数执行.(这与Java不同,其中变量初始化程序在基类构造函数之后但在构造函数体之前执行.)

因此,this在构造函数体内访问更安全:您可以确保对象至少在其基类(以及向上)方面进行初始化.

无论如何,我相信这是推理......

  • 很棒的一个jon skeet :) (2认同)
  • 是的,这就是推理.关于相关事项的一些注意事项:http://blogs.msdn.com/ericlippert/archive/2008/02/15/why-do-initializers-run-in-the-opposite-order-as-constructors-part-one. aspx和http://blogs.msdn.com/ericlippert/archive/2008/02/18/why-do-initializers-run-in-the-opposite-order-as-constructors-part-two.aspx (2认同)