最新更新 sitemap 网站制作设计本站搜索
网页设计
国外网站 韩国网站 个人主页 手提袋设计 CSS 网页特效 平面设计 网站设计 Flash CMS技巧 服装网站 php教程 photoshop 画册 服务器选用 数据库 Office
虚拟主机 域名注册 云主机 网页设计 客服QQ:8208442
当前位置:首页 > 编程开发 > asp教程

基类构造函数和初始化器的执行顺序技巧

日期:08-11    来源:中国设计秀    作者:cnwebshow.com

标题比较抽象,所以我写了一个Demo来说明问题:R3W中国设计秀
        public class AR3W中国设计秀
        {R3W中国设计秀
            public A()R3W中国设计秀
            {R3W中国设计秀
                Console.WriteLine("A的构造函数被调用");R3W中国设计秀
            }R3W中国设计秀
        }R3W中国设计秀
        public class B : AR3W中国设计秀
        {R3W中国设计秀
            PRivate X x = new X();  //初始化器R3W中国设计秀
        }R3W中国设计秀
        public class XR3W中国设计秀
        {R3W中国设计秀
            public X()R3W中国设计秀
            {R3W中国设计秀
                Console.WriteLine("X的构造函数调用");R3W中国设计秀
            }R3W中国设计秀
        }R3W中国设计秀
        static void Main(string[] args)R3W中国设计秀
        {R3W中国设计秀
            B b = new B();R3W中国设计秀
         }R3W中国设计秀
在调用子类的构造函数之前,会先调用基类的构造函数,那初始化器和基类的构造函数到底谁先执行呢?R3W中国设计秀
因为初始化代码会在构造函数中的代码之前执行,所以我过去错误的认为:R3W中国设计秀
        public class B : AR3W中国设计秀
        {R3W中国设计秀
            private X x = new X();  //初始化器R3W中国设计秀
        }R3W中国设计秀
等价于:R3W中国设计秀
        public class B : AR3W中国设计秀
        {R3W中国设计秀
            private X x;R3W中国设计秀
            public B()R3W中国设计秀
            {R3W中国设计秀
                 x=new X();R3W中国设计秀
             }R3W中国设计秀
        }R3W中国设计秀
所以我也错误的认为基类的构造函数是在子类的初始化器之前执行的,上面的Demo执行的结果刚好相反,是:R3W中国设计秀
X的构造函数调用R3W中国设计秀
A的构造函数被调用R3W中国设计秀
R3W中国设计秀
这表明子类的构造器先执行了,让我们看看生成的构造函数的IL代码:R3W中国设计秀
        public class B:AR3W中国设计秀
        {R3W中国设计秀
            private X x;R3W中国设计秀
            public B()R3W中国设计秀
            {R3W中国设计秀
                x = new X();R3W中国设计秀
            }R3W中国设计秀
        }R3W中国设计秀
生成的构造函数的IL代码是这样的:R3W中国设计秀
.method public hidebysig specialname rtspecialnameR3W中国设计秀
        instance void  .ctor() cil managedR3W中国设计秀
{R3W中国设计秀
  // 代码大小       21 (0x15)R3W中国设计秀
  .maxstack  8R3W中国设计秀
  IL_0000:  ldarg.0R3W中国设计秀
  IL_0001:  call       instance void Consoleapplication1.Program/A::.ctor()R3W中国设计秀
  IL_0006:  nopR3W中国设计秀
  IL_0007:  nopR3W中国设计秀
  IL_0008:  ldarg.0R3W中国设计秀
  IL_0009:  newobj     instance void ConsoleApplication1.Program/X::.ctor()R3W中国设计秀
  IL_000e:  stfld      class ConsoleApplication1.Program/X ConsoleApplication1.Program/B::xR3W中国设计秀
  IL_0013:  nopR3W中国设计秀
  IL_0014:  retR3W中国设计秀
} // end of method B::.ctorR3W中国设计秀
从代码可以看出是先调用基类的构造函数的!R3W中国设计秀
        public class B : AR3W中国设计秀
        {R3W中国设计秀
            private X x = new X();R3W中国设计秀
        }R3W中国设计秀
生成的构造函数的IL代码是这样的:R3W中国设计秀
.method public hidebysig specialname rtspecialnameR3W中国设计秀
        instance void  .ctor() cil managedR3W中国设计秀
{R3W中国设计秀
  // 代码大小       19 (0x13)R3W中国设计秀
  .maxstack  8R3W中国设计秀
  IL_0000:  ldarg.0R3W中国设计秀
  IL_0001:  newobj     instance void ConsoleApplication1.Program/X::.ctor()R3W中国设计秀
  IL_0006:  stfld      class ConsoleApplication1.Program/X ConsoleApplication1.Program/B::xR3W中国设计秀
  IL_000b:  ldarg.0R3W中国设计秀
  IL_000c:  call       instance void ConsoleApplication1.Program/A::.ctor()R3W中国设计秀
  IL_0011:  nopR3W中国设计秀
  IL_0012:  retR3W中国设计秀
} // end of method B::.ctorR3W中国设计秀
可以看出是先调用初始化器的代码,然后再调用基类构造函数的!可见使用初始化器和不使用初始化器还是有区别的,主要区别是基类构造函数的调用顺序不同!R3W中国设计秀
C#编译器为什么这样设计,我也没有想到太合理的原因,大家有什么看法呢?R3W中国设计秀
请大家多多指教啊!R3W中国设计秀

本文引用地址:/bc/article_46143.html
网站地图 | 关于我们 | 联系我们 | 网站建设 | 广告服务 | 版权声明 | 免责声明