Panduan Demo:
kelas umum A
{
publik A()
{
Console.WriteLine("A 的构造函数被调用");
}
}
kelas umum B : A
{
pribadi X x = X baru(); //初始化器
}
kelas umum X
{
publik X()
{
Console.WriteLine("X的构造函数调用");
}
}
kekosongan statis Utama (string[] args)
{
B b = baru B();
}
perusahaan asuransi kesehatan, perusahaan asuransi kesehatan, perusahaan asuransi kesehatan, perusahaan asuransi kesehatan, perusahaan asuransi kesehatan先执行呢?
因为初始化代码会在构造函数中的代码之前执行:
kelas umum B : A
{
pribadi X x = X baru(); //初始化器
}
Jawabannya:
kelas umum B : A
{
pribadi X x;
publik B()
{
x=X baru();
}
}
Panduan Pengguna Demo好相反,是:
X foto
Sebuah foto
这表明子类的构造器先执行了,让我们看看生成的构造函数的IL代码:
kelas umum B:A
{
pribadi X x;
publik B()
{
x = baru X();
}
}
生成的构造函数的IL代码是这样的:
.metode publik hidebysig nama khusus rtnama khusus
contoh void .ctor() cil dikelola
{
// 代码大小 21 (0x15)
.maxstack 8
IL_0000: ldarg.0
IL_0001: contoh panggilan batal ConsoleApplication1.Program/A::.ctor()
IL_0006: tidak
IL_0007: tidak
IL_0008: ldarg.0
IL_0009: instance objek baru batal ConsoleApplication1.Program/X::.ctor()
IL_000e: kelas stfld ConsoleApplication1.Program/X ConsoleApplication1.Program/B::x
IL_0013: tidak
IL_0014: purnawirawan
} // akhir metode B::.ctor
从代码可以看出是先调用基类的构造函数的!
kelas umum B : A
{
pribadi X x = X baru();
}
生成的构造函数的IL代码是这样的:
.metode publik hidebysig nama khusus rtnama khusus
contoh void .ctor() cil dikelola
{
// 代码大小 19 (0x13)
.maxstack 8
IL_0000: ldarg.0
IL_0001: instance objek baru batal ConsoleApplication1.Program/X::.ctor()
IL_0006: kelas stfld ConsoleApplication1.Program/X ConsoleApplication1.Program/B::x
IL_000b: ldarg.0
IL_000c: instance panggilan batal ConsoleApplication1.Program/A::.ctor()
IL_0011: tidak
IL_0012: purnawirawan
} // akhir metode B::.ctor
可以看出是先调用初始化器的代码,然后再调用基类构造函数的!可见使用初始化器和不使用初始化器还是有区别的,主要区别是基类构造函数的调用顺序不同!
C#编译器为什么这样设计,我也没有想到太合理的原因,大家有什么看法呢?
请大家多多指教啊!
-