2016-05-27 62 views
5

Quando si esegue l'estrazione, c'è la copia del valore in box in un tipo di variabile appropriato, ma ciò che accade nella posizione di memoria della copia in scatola su heap. La copia in scatola rimane in quella posizione e copre la memoria in heap?Meccanismo di Unboxing

risposta

4

La copia in scatola rimane in quella posizione e copre la memoria in heap?

Sì. Dopo tutto, ci potrebbero essere altri riferimenti ad esso:

object o1 = 5; 
object o2 = o1; 
int x = (int) o1; 
x = 10; 
Console.WriteLine(o2); // Still 5 

valori incasellati si comportano come oggetti normali, in termini di essere per la garbage collection, quando non ci sono più forti riferimenti ad essi.

3

Sì, naturalmente, quando si disattiva l'originale, l'originale rimane sempre inalterato.

Giù a livello di IL, ci sono due codici di accesso per l'unboxing: unbox.any e unbox.

Secondo MSDN, regarding unbox.any:

Quando applicato alla forma scatolata di un tipo valore, l'istruzione unbox.any estrae il valore contenuto all'interno obj (di tipo O), ed è pertanto equivalente a unbox seguito da ldobj.

e regarding unbox:

[...] Unbox non è tenuto a copiare il tipo di valore dall'oggetto. In genere calcola semplicemente l'indirizzo del tipo di valore che è già presente all'interno dell'oggetto boxato .

Quindi, una copia del valore originale può o non può essere fatta, ma il valore originale rimane sempre inalterato.