这有什么区别:
public class Foo {
private Bar bar;
public Foo() { bar = new Bar(); }
}
Run Code Online (Sandbox Code Playgroud)
还有这个:
public class Foo {
private Bar bar = new Bar();
public Foo() { }
}
Run Code Online (Sandbox Code Playgroud)
不同之处在于,在第二种情况下,字段初始化发生在此/ base构造函数之前,而在第一种情况下,初始化发生在构造函数内部.
CLR不支持初始化这样的字段.为了使它工作,C#编译器重写您的构造函数.IL看起来像这样:
IL_0000: ldarg.0
IL_0001: newobj instance void ConsoleApplication1.Bar::.ctor()
IL_0006: stfld class ConsoleApplication1.Bar ConsoleApplication1.Foo::bar
IL_000b: ldarg.0
IL_000c: call instance void [mscorlib]System.Object::.ctor()
IL_0011: ret
Run Code Online (Sandbox Code Playgroud)
请注意,在Foo基础构造函数之前调用Bar构造函数.与你的其他片段有什么不同,之后会调用Foo基础构造函数.除非继承该字段并且基类构造函数对其执行某些操作,否则这几乎不会产生任何影响.
或者,如果字段初始化程序相互依赖,则它们将按严格的文本顺序初始化.您可以通过在构造函数中显式执行来控制顺序.