构造函数或字段定义中的实例化有什么区别?

guh*_*hou 3 c# constructor

这有什么区别:

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)

Dar*_*rov 9

不同之处在于,在第二种情况下,字段初始化发生在此/ base构造函数之前,而在第一种情况下,初始化发生在构造函数内部.

  • @ BlueM937如果你有几个构造函数,那么你可能会复制代码 (2认同)

Han*_*ant 6

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基础构造函数.除非继承该字段并且基类构造函数对其执行某些操作,否则这几乎不会产生任何影响.

或者,如果字段初始化程序相互依赖,则它们将按严格的文本顺序初始化.您可以通过在构造函数中显式执行来控制顺序.