簡體   English   中英

在.NET中具有深度繼承的類的內存分配

[英]Memory allocation for a class that has deep inheritance in .NET

如果我有類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除了E

如果是這種情況,這會產生巨大的性能開銷嗎? 不是內存,而是運行時和GC明智的。

是的,它會創建A,B,C和D的“嵌入式”實例
不,它不會創建X,Y和Z的實例(因為它們是接口)

內存分配或GC(ABCD)沒有額外的開銷,因為E的實例被分配為1個塊。 任何運行時開銷都完全取決於所涉及的構造函數。

將始終存在一系列構造函數(從E到A),可能是默認構造函數,但也可以在1級調用多個構造函數。

它將創建一個單個對象 - 一個E實例 - 但它將包括在類層次結構中聲明的所有字段。 (接口不能聲明字段,因此它們與對象本身內的數據無關。)只有字段(以及影響布局的任何屬性,不可否認)才會對對象占用的內存產生影響。

對E實例的引用可以“轉換”為類型A,B,C,D,X,Y或Z的引用,作為保持身份的引用轉換 - 即它仍然是對同一對象的引用。

繼承擴展了Type ,但不創建實例。 您有一個E實例,其中包含由A,B,C,D和E定義的數據。它提供了由這些類以及接口X,Y和Z定義的方法和屬性訪問器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM