2016-05-22 41 views
10

Sono nuovo di programmazione,La boxe e l'Unboxing si verificano nell'array?

Come da MSDN,

La boxe è il processo di conversione di un tipo di valore per il tipo di oggetto o per qualsiasi tipo di interfaccia implementata da questo tipo di valore. Quando il CLR inserisce un tipo di valore, racchiude il valore all'interno di System.Object e lo memorizza nell'heap gestito. Unboxing estrae il tipo di valore dall'oggetto. La boxe è implicita; unboxing è esplicito.

Sapevo che siamo in grado di memorizzare qualsiasi oggetto in un arraylist, perché system.object è una base per tutti i tipi. Boxing e Unboxing si verificano nella lista di array. Sono d'accordo.

Il boxing e l'unboxing si verificano in un array? Perché siamo in grado di creare array di oggetto come il seguente

object[] arr = new object[4] { 1, "abc", 'c', 12.25 }; 

è la mia comprensione che la boxe e unboxing avviene in tale varietà corretta?

+0

Qui non è presente la boxe, poiché la matrice è già di tipo oggetto. in questo caso non c'è nulla da inscatolare. –

+0

@ Zohar - Ma il tipo di oggetto è il tipo predefinito per l'elenco di array a destra, Ma boxing e unboxing avviene lì – Aishu

+0

Come mai stai dicendo che la boxe non sta accadendo qui, Perché qui il tipo è oggetto, la boxe dovrebbe avvenire giusto? – Aishu

risposta

12

Il boxing e l'unboxing si verificano in un array?

L'array stesso è già un tipo di riferimento, non è presente alcun parallelepipedo sull'array stesso. Tuttavia, poiché alcuni dei tuoi elementi sono tipi di valore (int, double e char) e il tipo di array è object, si verificherà un parallelepipedo per tale elemento. Quando si vorrà per estrarlo, avrete bisogno di unboxing che:

var num = (int)arr[0]; 

si può vedere nella IL generato:

IL_0000: ldarg.0 
IL_0001: ldc.i4.4 
IL_0002: newarr [mscorlib]System.Object 
IL_0007: dup 
IL_0008: ldc.i4.0 
IL_0009: ldc.i4.1 
IL_000a: box [mscorlib]System.Int32 // Boxing of int 
IL_000f: stelem.ref 
IL_0010: dup 
IL_0011: ldc.i4.1 
IL_0012: ldstr "abc" 
IL_0017: stelem.ref 
IL_0018: dup 
IL_0019: ldc.i4.2 
IL_001a: ldc.i4.s 99 
IL_001c: box [mscorlib]System.Char 
IL_0021: stelem.ref 
IL_0022: dup 
IL_0023: ldc.i4.3 
IL_0024: ldc.r8 12.25 
IL_002d: box [mscorlib]System.Double 
IL_0032: stelem.ref 
IL_0033: stfld object[] C::arr 
IL_0038: ldarg.0 
IL_0039: call instance void [mscorlib]System.Object::.ctor() 
IL_003e: nop 
IL_003f: ret 
6

Sì, tipo di valore elementi (1, 'c 'e 12.25) verranno inseriti in una scatola una volta posizionati nell'array di object[].

La stringa "abc" verrà posizionata così com'è poiché è un oggetto di riferimento.

5

Ogni volta che si assegna un valore di un tipo valore ad una variabile di tipo object un'operazione di boxe si verificherà, così quando si fa:

object[] arr = new object[4] { 1, "abc", 'c', 12.25 }; 

che equivale a

object[] arr = new object[4]; 
arr[0] = 1; 
arr[1] = "abc"; 
arr[2] = 'c'; 
arr[3] = 12.25 

Tre caselle verranno create per memorizzare , 12.25 e 'c' perché sono valori di tipi di valore.