麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(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ā)表
主站蜘蛛池模板: 性生活视频一级 | 免费在线看黄 | 午夜精品视频在线 | 国产91九色 | 91一区二区三区久久久久国产乱 | 久产久精品 | 毛片网站视频 | 午夜视频在线免费播放 | 成人羞羞在线观看网站 | 精品成人免费一区二区在线播放 | 久久久噜噜噜久久熟有声小说 | 亚洲免费视频大全 | 激情大乳女做爰办公室韩国 | 久久国产精品久久精品国产演员表 | 欧美精品欧美极品欧美激情 | 久草在线视频新 | 黄色特级视频 | 毛片在哪看 | 桥本有菜免费av一区二区三区 | 精品国产一区二区在线 | 国产一区免费视频 | 色交视频| 在线影院av| 亚洲网站一区 | 亚洲国产精品高潮呻吟久久 | 欧美日韩a∨毛片一区 | 成年性羞羞视频免费观看无限 | 精国产品一区二区三区四季综 | 91网视频| freexxx69性欧美hd| 日日摸夜夜骑 | 91麻豆蜜桃一区二区三区 | 久久精品视频2 | 国产免费专区 | 黄色免费小网站 | 99国产精品国产免费观看 | 亚洲一级网站 | 成人一级在线 | 91av国产在线| 99成人精品视频 | 91九色免费视频 |