这归结于编码偏好,正如其中一条评论所述。如果您编译以下代码。
public class TestInitialization
{
private object test1 = new object();
private object test2;
public TestInitialization()
{
this.test2 = new object();
}
}
编译后,实际使用的代码如下
public class TestInitialization
{
private object test1;
private object test2;
public TestInitialization()
{
this.test1 = new object();
this.test2 = new object();
}
}
所以它们是完全相同的东西,使用任何一个都可以。
编辑:
这里有一个基类和继承类的示例以及生成的编译IL。
基类
class basetest
{
private object test1 = new object();
private object test2;
public basetest()
{
this.test2 = new object();
}
}
继承类
class testclass : basetest
{
private object testclass1 = new object();
private object testclass2;
public testclass() : base()
{
this.testclass2 = new object();
}
}
生成的IL基类
.class private auto ansi beforefieldinit basetest
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: newobj instance void [mscorlib]System.Object::.ctor()
L_0006: stfld object logtest.basetest::test1
L_000b: ldarg.0
L_000c: call instance void [mscorlib]System.Object::.ctor()
L_0011: nop
L_0012: nop
L_0013: ldarg.0
L_0014: newobj instance void [mscorlib]System.Object::.ctor()
L_0019: stfld object logtest.basetest::test2
L_001e: nop
L_001f: ret
}
.field private object test1
.field private object test2
}
继承类 IL
.class private auto ansi beforefieldinit testclass
extends logtest.basetest
{
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: newobj instance void [mscorlib]System.Object::.ctor()
L_0006: stfld object logtest.testclass::testclass1
L_000b: ldarg.0
L_000c: call instance void logtest.basetest::.ctor()
L_0011: nop
L_0012: nop
L_0013: ldarg.0
L_0014: newobj instance void [mscorlib]System.Object::.ctor()
L_0019: stfld object logtest.testclass::testclass2
L_001e: nop
L_001f: ret
}
.field private object testclass1
.field private object testclass2
}
我觉得我有点困惑。在这个例子中,构造函数外的初始化器在调用基类构造函数之前首先被初始化。因此,无论如何,在构造函数内部的初始化器之前,构造函数外的初始化器都将首先被初始化,对于大多数情况来说,这并不重要。从技术上讲,它们都会被转换为在构造函数内部进行初始化,并遵循以下规则:
- 所有构造函数外的初始化器都会首先运行
- 调用所有基类构造函数
- 运行构造函数内的所有初始化器
基本上,编译器将所有构造函数外的初始化器预置到构造函数代码中,然后按照正常方式运行。
所以这个:
public class test : basetest
{
private object test1 = new object();
private object test2;
public test() : base()
{
this.test2 = new object();
}
}
public class basetest
{
private object basetest1 = new object();
private object basetest2;
public basetest()
{
this.basetest2 = new object();
}
}
变成
public class test : basetest
{
private object test1;
private object test2;
public test()
{
this.test1 = new object();
base();
this.test2 = new object();
}
}
public class basetest
{
private object basetest1;
private object basetest2;
public basetest()
{
this.basetest1 = new object();
this.basetest2 = new object();
}
}
希望这样更有意义并澄清了一些事情。我知道当一些人说它在构造函数之外运行“first”或“outside”时,我有些困惑;实际上,它全部在构造函数内部运行,但调用的顺序会受到影响。