Демо-версия 来说明问题:
общественный класс А
{
публичный А()
{
Console.WriteLine("Полное сообщение с текстом");
}
}
общественный класс B: A
{
частный X x = новый X(); //初始化器
}
общественный класс X
{
публичный Х()
{
Console.WriteLine("X的构造函数调用");
}
}
static void Main(string[] args)
{
B b = новый B();
}
在调用子类的构造函数之前,伌会先调用基类的构造函数, 那初始化器和基类的构造函数到底谁先执行呢?
因为初始化代码会在构造函数中的代码之前执行,所以我过去错误的认为:
общественный класс B: A
{
частный X x = новый X(); //初始化器
}
等价于:
общественный класс B: A
{
частный Х х;
публичный Б()
{
х=новый X();
}
}
Демо-версия фильма «Демо-версия», «Демо-версия»刚好相反,是:
X的构造函数调用
的构造函数被调用
这表明子类的构造器先执行了,让我们看看生成的构造函数的代码:
общественный класс B:A
{
частный Х х;
публичный Б()
{
х = новый X();
}
}
День рождения в штате Иллинойс:
.method publicidebysig специальное имя rtspecialname
экземпляр void .ctor() управляемый cil
{
// Размер файла 21 (0x15)
.maxstack 8
IL_0000: ldarg.0
IL_0001: экземпляр вызова void ConsoleApplication1.Program/A::.ctor()
IL_0006: нет
IL_0007: нет
IL_0008: лдарг.0
IL_0009: экземпляр newobj void ConsoleApplication1.Program/X::.ctor()
IL_000e: класс stfld ConsoleApplication1.Program/X ConsoleApplication1.Program/B::x
IL_0013: нет
IL_0014: в отставку
} // конец метода B::.ctor
从代码可以看出是先调用基类的构造函数的!
общественный класс B: A
{
частный X x = новый X();
}
День рождения в штате Иллинойс:
.method publicidebysig специальное имя rtspecialname
экземпляр void .ctor() управляемый cil
{
// Размер файла 19 (0x13)
.maxstack 8
IL_0000: ldarg.0
IL_0001: экземпляр newobj void ConsoleApplication1.Program/X::.ctor()
IL_0006: класс stfld ConsoleApplication1.Program/X ConsoleApplication1.Program/B::x
IL_000b: ldarg.0
IL_000c: экземпляр вызова void ConsoleApplication1.Program/A::.ctor()
IL_0011: нет
IL_0012: в отставку
} // конец метода B::.ctor
可以看出是先调用初始化器的代码,然后再调用基类构造函数的!可见使用初始化器和不使用初始化器还是有区别的,主要区别是基类构造函数的调用顺序不同!
C# 编译器为什么这样设计,我也没有想到太合理的原因,大家有什么看法呢?
请大家多多指教啊!
-