标题比较抽象,所以我写了一个Demo来说明问题:
public class A
{
public A()
{
Console.WriteLine("A的构造函数被调用");
}
}
public class B : A
{
private X x = new X(); //初始化器
}
public class X
{
public X()
{
Console.WriteLine("X的构造函数调用");
}
}
static void Main(string[] args)
{
B b = new B();
}
在调用子类的构造函数之前,会先调用基类的构造函数,那初始化器和基类的构造函数到底谁先执行呢?
因为初始化代码会在构造函数中的代码之前执行,所以我过去错误的认为:
public class B : A
{
private X x = new X(); //初始化器
}
等价于:
public class B : A
{
private X x;
public B()
{
x=new X();
}
}
所以我也错误的认为基类的构造函数是在子类的初始化器之前执行的,上面的Demo执行的结果刚好相反,是:
X的构造函数调用
A的构造函数被调用
这表明子类的构造器先执行了,让我们看看生成的构造函数的IL代码:
public class B:A
{
private X x;
public B()
{
x = new X();
}
}