首页 > 代码库 > 对象初始化的顺序
对象初始化的顺序
一个对象初始化时的顺序是:
在不考虑继承关系时,那么顺序如下:
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可能调用派生类中的字段,所以必须要先实例化好了.
一个最容易忽略的初始化还有这么多名堂...
对象初始化的顺序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。