先看看一般类的实例化构建顺序
无继承的情况
- 静态字段
- 静态构造方法
- 实例字段
- 实例构造方法
有继承的情况
- 子类(派生类)的静态字段
- 子类(派生类)的静态构造方法
- 子类(派生类)的实例字段
- 父类(基类)的静态字段
- 父类(基类)的静态构造方法
- 父类(基类)的实例字段
- 父类(基类)的实例构造方法
- 子类(派生类)的实例构造方法
这两种情况还是很好理解的。总体来说字段是先于构造函数执行的,不然构造函数拿什么去执行。派生类的字段,和基类的实例先执行,然后再执行派生类的构造函数。这里是,基类的构造函数先执行,然后再执行派生类的构造函数。下面验证下:
1 | using System; |
输出:
1 | B |
基类的构造函数先执行,然后再执行派生类的构造函数。这里是对的。
C++ 的构造函数和析构函数执行顺序
先调用父类(基类)的构造函数,再调用派生类的构造函数;
变量销毁时:先调用派生类的析构函数,再调用父类(基类)的析构函数。
1 |
|
输出:
1 | 基类:AAAAAAAAAAAA |
看下对象初始化器和构造函数谁先执行
结论:构造函数先于对象初始化器执行,然后,窗体程序的话,对象初始化器先于Load
事件执行。
Form1.cs:
1 | using System; |
Form2.cs:
1 | using System; |