2011-06-06 14 views
5

Gli esempi di boxing/unboxing sono 2 e 3?Questi esempi di boxing/unboxing

1) L'esempio documentazione:

int i = 123; 
object iBoxed = i; 
i = (int) iBoxed; 

2: E 'la boxe/unboxing come bene?

int i = 123; 
object iBoxed = i; 
i = Int32.Parse(iBoxed.ToString()); 

3: E 'la boxe/unboxing come bene?

int i = 123; 
object iBoxed = i; 
i = Convert.ToInt32(iBoxed); 

considera che in tutti gli esempi accade tecnicamente stesso.

  1. Un tipo di valore viene creata in pila viene creato
  2. Un riferimento in pila, il valore viene copiato mucchio.
  3. Il valore heap viene copiato nel riferimento. Il riferimento viene eliminato.

Quindi immagino che 2 e 3 siano esempi di boxing/unboxing?

+0

penso di sì, dal momento che si inserisce un oggetto in "scatola" e poi si ritira da quella casella. L'idea alla base di box e unbox è di cambiare un tipo di valore in un tipo di riferimento e ritornare –

risposta

7

In tutti e tre gli esempi:

iBoxed è una copia in scatola di i.

Nell'esempio 2: Non v'è coinvolto unboxing qui, come ToString è un metodo virtuale che finalmente risolvere a int.ToString, che verrà poi analizzato da int.Parse, restituendo un non-inscatolato int in pila.

Nell'esempio 3: iBoxed otterrà unboxed nel corpo del metodo Convert.ToInt32 e restituito come un intero non confezionato, in pila nuovamente.

+0

@dtb: Sì, è quello che ho tentato di dire. L'unboxing non viene eseguito nelle righe che vediamo, avviene nel corpo di 'Convert.ToInt32'. –

+0

Ho risolto l'esempio 2, che comunque non è stato compilato. – Robert

+0

Ho modificato la mia risposta in base al tuo esempio fisso. –

1

È object iBoxed = i che fanno la boxe.

Esempio 2 non funzionerà poiché int.Parse prevede una stringa

+0

Ho risolto l'esempio 2. Thx. – Robert

2

Il secondo esempio è il pugilato ma non il disimballaggio. L'int.parse non verrà compilato perché si aspetta una stringa e iBoxed è un oggetto. Penso che tu stia mescolando i concetti di boxe e conversione. La boxe si basa sul prendere un tipo di valore, ad esempio il POD come si dice in C e trattarlo come un univoco di riferimento è la capacità di estrarre lo stesso tipo di valore dal suo contenitore.

Ex 2. Fixed

int i = 123; // Assigment 
object iBoxed = i ; // This is boxing 
i = int.parse(iBoxed.toString()); //This is unboxing but only for the twostring method the assignment is a value type copy. 
+0

Ho risolto l'esempio 2. – Robert

0

In tutti gli esempi, il tipo di valore i viene convertito in un oggetto. Questa è la definizione di boxing secondo MSDN. La boxe potrebbe anche essere eseguita da:

object boxed = (object)i; 

L'annullamento della corrispondenza è la conversione dell'oggetto in un tipo di valore.
Esempio 1 è unboxing

Esempio 2 non riuscirà a compilare perché Parse si aspetta un argomento string ma sarebbe unboxing se l'avete fatto iBoxed.ToString()

Esempio 3 i sospetto che non è unboxing perché il metodo Convert sarà solo restituirà il valore che tu passi.

Vale la pena essere a conoscenza del colpo di performance di boxe e unboxing. È più costoso del normale incarico.