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

标题比较抽象,所以我写了一个Demo来说明问题:

public class A
         {
             public A()
             {
                 Console.WriteLine("A的构造函数被调用");
             }
         }
         public class B : A
         {
             private X x = new X();  //初始化器
         }
         public class X
         {
             public X()
             {
                 Console.WriteLine("X的构造函数调用");
             }
         }
         static void Main(string[] args)
         {
             B b = new B();
          }

在调用子类的构造函数之前,会先调用基类的构造函数,那初始化器和基类的构造函数到底谁先执行呢?

因为初始化代码会在构造函数中的代码之前执行,所以我过去错误的认为:

public class B : A
         {
             private X x = new X();  //初始化器
         }

等价于:

public class B : A
         {
             private X x;
             public B()
             {
                  x=new X();
              }
         }

所以我也错误的认为基类的构造函数是在子类的初始化器之前执行的,上面的Demo执行的结果刚好相反,是:

X的构造函数调用

A的构造函数被调用

这表明子类的构造器先执行了,让我们看看生成的构造函数的IL代码:

public class B:A
         {
             private X x;
             public B()
             {
                 x = new X();
             }
         }

时间: 2024-07-29 13:52:28

基类构造函数和初始化器的执行顺序的相关文章

Swift快速给Cocoa库内置类添加便捷初始化器

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) Cocoa中的NSShadow类默认没有我们需要的实例方法,为了创建一个指定的实例,我们需要分3步来完成: let shadow = NSShadow() shadow.shadowColor = UIColor.redColor() shadow.shadowOffset = CGSize(width:4,height:4) 为什么不写一个初始化器一步到位呢

c++构造函数的初始化列表中初始化了一个类类型的成员,调用的是类类型的复制构造函数吧?

问题描述 c++构造函数的初始化列表中初始化了一个类类型的成员,调用的是类类型的复制构造函数吧? 如题:c++构造函数的初始化列表中初始化了一个类类型的成员,调用的是类类型的复制构造函数吧? 解决方案 什么?复制构造函数? 解决方案二: C++类构造函数列表初始化C++类构造函数初始化列表c++中什么类型的成员变量只能在构造函数的初始化列表中进行 解决方案三: 真是初始化列表,跟复制构造函数没关系,调用复制构造函数要看你是如何初始化的 解决方案四: 参数列表初始化成员是调用成员的构造函数,但是什

Entity Framework 实体框架的形成之旅--基类接口的统一和异步操作的实现(3)

在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建了一个简单的基于泛型的仓储模式的框架:在随笔<Entity Framework 实体框架的形成之旅--利用Unity对象依赖注入优化实体框架(2)>则持续优化这个仓储模式的实体框架,主要介绍业务逻辑层的构建,以及利用Unity和反射进行动态的对象注册.本篇主要介绍基类接口的统一和异步操作的实现等方

c++ 构造函数的初始化列表

构造函数的初始化列表仅仅指定用于初始化成员的值,并不指定这些初始化执行的次序.成员初始化的次序就是定义成员的次序,第一个成员首先被初始化,然后是第二个,依次类推   首先,运行下图中的C++代码,输出是什么? 复制代码 代码如下: class A { private:  int n1;  int n2; public:  A(): n2(0) , n1(n2 + 2)  {  }  void Print()  {   cout<<"n1:"<<n1<<

(一三六)基类——第十三章

OOP编程的主要目的之一是提供可以重用的代码(比如类,可以反复使用).   C++有类库.类库由类声明和实现构成.因为类组合了类数据表示和类方法,因此提供了比函数库更加完整的程序包(函数库里的函数,也可以放置在类中作为类方法). 例如,单个类就可以提供用于管理对话框的全部资源.   类库 通常是以源代码的方式提供的(传统的C函数库则是以函数库的形式,往往没有源代码).   C++提供了比修改代码更好的方式来扩展和修改类,这种方法叫做 类继承.   类继承可以从已有的类派生出新的类,而派生类继承了

c++ 构造函数的初始化列表_C 语言

首先,运行下图中的C++代码,输出是什么? 复制代码 代码如下: class A{private: int n1; int n2;public: A(): n2(0) , n1(n2 + 2) { } void Print() {  cout<<"n1:"<<n1<<",n2:"<<n2<<endl; }};int main(void){ A a; a.Print(); return 0;} 答案:输出n1

一起谈.NET技术,话说索引器、foreach和集合初始化器

索引器 在使用集合类时我们经常用到索引器,例如List集合,我们使用int数字作为索引器参数,而字典集合我们可以使用任何对象作为索引器参数. 在我们自己定义的类中使用索引器的情况也许不多,现在举例详细说明一下.假设我们定义首都类( Capital ): public class Capital {/// <summary>/// 名称/// </summary> public string Name { get; set; } /// <summary>/// 定位//

举例说明Java中代码块的执行顺序_java

前言    今天在看Android ContentProvider实现的时候,突然想到了Java类在new的过程中,静态域.静态块.非静态域.非静态块.构造函数的执行顺序问题.其实这是一个很经典的问题,非常考察对Java基础知识的掌握程度.很多面试过程中相信也有这样的问题,趁着周末有时间复习一下. 结论    这里先把整理好的结论抛给大家,然后我在写个程序来验证我们的结论.在Java类被new的过程中,执行顺序如下:     实现自身的静态属性和静态代码块.(根据代码出现的顺序决定谁先执行)  

Linq之隐式类型、自动属性、初始化器、匿名类

目录 写在前面 系列文章 隐式类型 自动属性 初始化器 匿名类 总结 写在前面 上篇文章是本系列的小插曲,也是在项目中遇到,觉得有必要总结一下,就顺手写在了博客中,也希望能帮到一些朋友.本文将继续介绍linq系列的基础知识,隐式类型,自动属性,初始化器,匿名类的相关概念,这些内容也许与linq相关也许不相关,但还是放一起总结吧,也算是复习了.部分内容通过反编译的方式一探究竟. 系列文章 Linq之Lambda表达式初步认识 Linq之Lambda进阶 隐式类型 先看看Msdn上对隐式类型的简单定