2012-10-23 14 views
6

Se ho due classi, A e B dove B deriva da A:informazioni sulla Casted C Tipi # riferimento nella memoria

class A {} 
class B : A { } 

posso upcast tranquillamente un'istanza di B-A.

B b = new B(); 
A a = b; 

Ora, posso capire come il runtime può determinare che tipo sottostante è B, come la pagina 132 del ECMA-335 (Common Language Infrastructure (CLI) partizioni da I a VI) afferma

oggetti di tipi istanziati devono fornire informazioni sufficienti a recuperare in fase di esecuzione il loro tipo esatto (compresi i tipi e il numero di loro argomenti generici). [Rationale: Questo è necessario per correttamente implementare colata e istanza di test, così come nella riflessione capacità

Così, come fa il runtime sa che, sebbene il tipo sottostante è B È infatti memorizzato in un A. So per certo che non vedrò i metodi disponibili su B, ma se il tipo sottostante è B, come memorizza il tipo di posizione di archiviazione A?

Ha senso?

risposta

7

l'oggetto è una B, e la CLI sa che è una B. La cosa che conosce A è principalmente il compilatore, che poi dichiara campo o locale come di tipo A (o, in In alcuni casi, come il concatenamento del metodo, il tipo è noto tramite il tipo restituito del metodo, che viene stampato con forza nel IL del chiamante . Quindi in pratica: il codice chiamante è quello che dice "Penso che questo sia un A". Gli incarichi ecc. Sono solitamente tutti verificabili in anticipo, quindi non c'è rischio di sbagliare. Se si tenta di modificare l'IL per sbagliare deliberatamente, il runtime ti avviserà e rifiuterà di eseguire il metodo. E per questi motivi, l'assegnazione di un valore noto come B a un campo/A locale non richiede alcun tipo di controllo, ma solo un compito diretto.

+0

Cheers Marc, è spiegato. –

3

Il tipo effettivo dell'oggetto viene sempre archiviato con l'oggetto stesso nell'heap. Un riferimento che punta a quell'oggetto può essere di un tipo diverso purché quel tipo sia assegnabile dal tipo effettivo (ad esempio una classe base o un'interfaccia implementata di quel tipo).

Ogni oggetto nell'heap ha una piccola quantità di dati memorizzati con esso - il tipo di quell'oggetto è una di quelle cose.