在.NET中具有深度inheritance的类的内存分配

如果我有类A, B, C, D, E ,以及X, Y, Z和模型等接口,那么系统就像:

 class B : A, X class C : B, Y class D : C, Z class E : D 

如果A是一个抽象基类而E是感兴趣的类,当我创建一个E实例时,它会依次创建A, B, C, D, X, Y, Z实例吗?

如果是这种情况,这会产生巨大的性能开销吗? 不是内存,而是运行时和GC明智。

是的,它会创建A,B,C和D的“嵌入式”实例
不,它不会创建X,Y和Z的实例(因为它们是接口)

内存分配或GC(ABCD)没有额外的开销,因为E的实例被分配为1个块。 任何运行时开销都完全取决于所涉及的构造函数。

总会有一系列的构造函数(从E到A)被执行,可能是默认构造函数,但也可以在1级调用多个构造函数。

它将创建一个单个对象 – 一个E实例 – 但它将包括在类层次结构中声明的所有字段。 (接口不能声明字段,因此它们与对象本身内的数据无关。)只有字段(以及影响布局的任何属性,不可否认)才会对对象占用的内存产生影响。

对E实例的引用可以“转换”为类型A,B,C,D,X,Y或Z的引用,作为保持身份的引用转换 – 即它仍然是对同一对象的引用。

inheritance扩展了Type并且不创建实例。 您有一个E实例,其中包含由A,B,C,D和E定义的数据。它提供了由这些类以及接口X,Y和Z定义的方法和属性访问器。