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

Joa*_*nge 5 .net c# performance memory-management

如果我有类A, B, C, D, E,接口X, Y, Z,并建立一个系统,如:

class B : A, X
class C : B, Y
class D : C, Z
class E : D
Run Code Online (Sandbox Code Playgroud)

如果A是一个抽象基类和E是类感兴趣,当我创建E的情况下,将它反过来创建的实例A, B, C, D, X, Y, ZE

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

Hen*_*man 7

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

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

将始终存在一系列构造函数(从E到A),可能是默认构造函数,但也可以在1级调用多个构造函数.


Jon*_*eet 7

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

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