標(biāo)題比較抽象,所以我寫(xiě)了一個(gè)Demo來(lái)說(shuō)明問(wèn)題: public class A { public A() { Console.WriteLine("A的構(gòu)造函數(shù)被調(diào)用"); } } public class B : A { PRivate X x = new X(); //初始化器 } public class X { public X() { Console.WriteLine("X的構(gòu)造函數(shù)調(diào)用"); } } static void Main(string[] args) { B b = new B(); } 在調(diào)用子類(lèi)的構(gòu)造函數(shù)之前,會(huì)先調(diào)用基類(lèi)的構(gòu)造函數(shù),那初始化器和基類(lèi)的構(gòu)造函數(shù)到底誰(shuí)先執(zhí)行呢? 因?yàn)槌跏蓟a會(huì)在構(gòu)造函數(shù)中的代碼之前執(zhí)行,所以我過(guò)去錯(cuò)誤的認(rèn)為: public class B : A { private X x = new X(); //初始化器 } 等價(jià)于: public class B : A { private X x; public B() { x=new X(); } } 所以我也錯(cuò)誤的認(rèn)為基類(lèi)的構(gòu)造函數(shù)是在子類(lèi)的初始化器之前執(zhí)行的,上面的Demo執(zhí)行的結(jié)果剛好相反,是: X的構(gòu)造函數(shù)調(diào)用 A的構(gòu)造函數(shù)被調(diào)用
這表明子類(lèi)的構(gòu)造器先執(zhí)行了,讓我們看看生成的構(gòu)造函數(shù)的IL代碼: public class B:A { private X x; public B() { x = new X(); } } 生成的構(gòu)造函數(shù)的IL代碼是這樣的: .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // 代碼大小 21 (0x15) .maxstack 8 IL_0000: ldarg.0 IL_0001: call instance void Consoleapplication1.Program/A::.ctor() IL_0006: nop IL_0007: nop IL_0008: ldarg.0 IL_0009: newobj instance void ConsoleApplication1.Program/X::.ctor() IL_000e: stfld class ConsoleApplication1.Program/X ConsoleApplication1.Program/B::x IL_0013: nop IL_0014: ret } // end of method B::.ctor 從代碼可以看出是先調(diào)用基類(lèi)的構(gòu)造函數(shù)的! public class B : A { private X x = new X(); } 生成的構(gòu)造函數(shù)的IL代碼是這樣的: .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // 代碼大小 19 (0x13) .maxstack 8 IL_0000: ldarg.0 IL_0001: newobj instance void ConsoleApplication1.Program/X::.ctor() IL_0006: stfld class ConsoleApplication1.Program/X ConsoleApplication1.Program/B::x IL_000b: ldarg.0 IL_000c: call instance void ConsoleApplication1.Program/A::.ctor() IL_0011: nop IL_0012: ret } // end of method B::.ctor 可以看出是先調(diào)用初始化器的代碼,然后再調(diào)用基類(lèi)構(gòu)造函數(shù)的!可見(jiàn)使用初始化器和不使用初始化器還是有區(qū)別的,主要區(qū)別是基類(lèi)構(gòu)造函數(shù)的調(diào)用順序不同! C#編譯器為什么這樣設(shè)計(jì),我也沒(méi)有想到太合理的原因,大家有什么看法呢? 請(qǐng)大家多多指教啊!