一个对象初始化时的顺序是:
在不考虑继承关系时,那么顺序如下:
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可能调用派生类中的字段,所以必须要先实例化好了.
一个最容易忽略的初始化还有这么多名堂...
时间: 2024-10-08 06:49:57