首页 > 代码库 > 对象初始化的顺序

对象初始化的顺序

一个对象初始化时的顺序是:

在不考虑继承关系时,那么顺序如下:

static Field -->static ctor --> instance Field -->instance ctor

原因:因为static ctor可能会用到static Field,所以必须先字段

 

考虑继承关系时,则是

class Base{}

class Derived:Base{}

Derived static Field --> Derived static ctor --> Derived instance Field --> Base instance Field -->Base instance ctor --> Dervied instance ctor

试想有这么一个基类,它在构造函数中调用了一个虚方法。然后又有这么一个派生类,它重写了基类的那个虚方法,并且在这个虚方法中访问了它自己的一个实例成员字段。

这一切都是完全合法的(至少在C#的世界里是这样的),对吧?在实例化一个派生类对象的过程中,其基类的构造函数会被调用,接着那个虚方法也会被调用,再接着派生类的实例成员字段会被访问。

所以此时此刻,这个类的实例成员字段必须是已被准备好了的!因此,派生类的实例成员字段必须先于基类部分被构造。

 

总之就是为了防止virtual function可能调用派生类中的字段,所以必须要先实例化好了.

一个最容易忽略的初始化还有这么多名堂...

 

对象初始化的顺序