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

这有什么区别:

public class Foo { private Bar bar; public Foo() { bar = new Bar(); } } 

还有这个:

 public class Foo { private Bar bar = new Bar(); public Foo() { } } 

不同之处在于,在第二种情况下,字段初始化发生在此/ 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 

请注意,在Foo基础构造函数之前调用Bar构造函数。 这与你的其他片段有什么不同, 之后会调用Foo基础构造函数。 除非字段是inheritance的,并且基类构造函数对它执行某些操作, 否则这几乎不会产生任何影响。

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

说明一点,但第二种方法不需要构造函数。

没有区别,因为编译器将所有字段定义放在构造函数的代码之前。 所以在IL-code中,两种变体看起来都是一样的

要添加到Darin Dimitrov的答案,如果你有几个构造函数重载,并且由于某种原因你不想调用其他重载的构造函数,那么初始化字段是一个好主意。