2010-03-04 10 views
5

Se devo classi A, B, C, D, E e interfacce come X, Y, Z, e il modello di un sistema come:allocazione di memoria per una classe che ha una profonda eredità nel .NET

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

Se A è una classe base astratta ed E è il classe di interesse, quando creo un'istanza di E, creerebbe a sua volta istanze di A, B, C, D, X, Y, Z oltre a E?

Se questo è il caso, ciò creerebbe un enorme sovraccarico di prestazioni? Non memoria, ma runtime e GC saggio.

risposta

7

Sì, sarebbe creare istanze 'integrati' di A, B, C e D
No, non sarebbe creare istanze di X, Y e Z (perché sono interfacce)

Non c'è più overhead per l'allocazione di memoria o GC (di ABCD) perché l'istanza di E è allocata come 1 blocco. Qualsiasi sovraccarico di runtime dipenderebbe interamente dai costruttori coinvolti.

Ci sarà sempre una catena di contructor (da E a A) in esecuzione, probabilmente il costruttore predefinito ma è anche possibile chiamare più costruttori a 1 livello.

+0

Siamo spiacenti, ma non esistono istanze create per eredità! – AxelEckenberger

+0

@ Obalix, annotare le virgolette attorno a quelle incorporate. Ma sì, alla fine c'è solo 1 istanza coinvolta. –

+0

Grazie Henk, quindi in questo caso, ad esempio se dovessi unire queste classi in una singola classe senza ereditarietà, sarebbero praticamente uguali in termini di memoria, GC e prestazioni di runtime? –

2

L'ereditarietà estende tipo e non crea istanze. Hai una singola istanza di E che include i dati definiti da A, B, C, D ed E. Fornisce metodi e proprietà di accesso definiti da queste classi e dalle interfacce X, Y e Z.

7

Creerebbe un singolo oggetto - un'istanza di E - ma che includerebbe tutti i campi dichiarati nella gerarchia di classi. (Le interfacce non possono dichiarare campi, quindi sono irrilevanti per i dati all'interno dell'oggetto stesso.) Sono solo i campi (e tutti gli attributi che influenzano il layout, ammettiamolo) che contribuiscono alla memoria occupata da un oggetto.

Il riferimento all'istanza di E potrebbe essere "convertito" in un riferimento di tipo A, B, C, D, X, Y o Z come una conversione di riferimento che preserva l'identità, cioè sarebbe comunque un riferimento a lo stesso oggetto.

+0

Grazie Jon. Quando converti E in uno dei precedenti, creerebbe una nuova istanza? Penso che lo faccia per le classi base, giusto? Ma per le interfacce? –

+0

Ad esempio, se si dovessero unire queste classi in una singola classe senza ereditarietà, sarebbero praticamente uguali in termini di memoria, GC e prestazioni di runtime? –

+1

@Joan: non si converte l'istanza di E, solo il riferimento a un'istanza è 'convertito', che è molto economico. –

Problemi correlati