国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

基類(lèi)構(gòu)造函數(shù)和初始化器的執(zhí)行順序!

2019-11-17 03:52:49
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
標(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)大家多多指教啊!

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 五原县| 自贡市| 庆元县| 乐平市| 安多县| 治多县| 正镶白旗| 宜章县| 鹿邑县| 陵水| 大悟县| 定远县| 田阳县| 科技| 长白| 灌南县| 延吉市| 东平县| 鄢陵县| 泗阳县| 甘肃省| 枞阳县| 清水县| 文山县| 会同县| 区。| 三明市| 措勤县| 桐庐县| 恩平市| 陆丰市| 称多县| 阿勒泰市| 南靖县| 托克托县| 子洲县| 太白县| 奈曼旗| 米脂县| 固阳县| 砚山县|