Domanda

possibili duplicati:
perché abbiamo bisogno di boxing e unboxing in C #?
Che cosa è la boxe e unboxing e quali sono il commercio off?

In C # significa che cosa doe sit:? "Box e Unbox"

Ecco un estratto da MSDN in cui ho fondato il testo.

Ma questa comodità ha un costo. Qualsiasi tipo di riferimento o valore che è aggiunto a un ArrayList è implicitamente upcast a oggetto. Se gli elementi sono tipi di valore, essi devono essere inscatolati quando sono aggiunti alla lista, e unboxed quando vengono recuperati. Tutti e due la fusione e la boxe e operazioni unboxing diminuiscono prestazione; l'effetto di boxe e unboxing può essere molto significativo scenari in cui è necessario iterare grandi collezioni.

Grazie!

È stato utile?

Soluzione

Ecco una spiegazione più dettagliata che guarda al interno di Common Language Runtime.

Per prima cosa, facciamo la differenza tra i tipi di Valore e di riferimento :

  • Un tipo di valore viene mantenuto sul pila e una copia viene passato a chiamate metodi
  • valore di riferimento A è tenuto in gestita e la pila mucchio detiene solo un puntatore (riferimento) alla sua posizione. La posizione, e non l'oggetto, viene passato a metodi chiamati

Se non si sa che cosa la pila è (non essere offesa), è una zona di memoria che contiene le variabili locali in un metodo e gli indirizzi di funzioni di chiamata utilizzati per l'istruzione return (giusto per essere brevi e fornire un generale risposta). Quando si chiama un metodo, una superficie sufficiente sulla pila è staticamente assegnatogli, quindi allocazione stack viene sempre chiamato allocazione statica.

Il mucchio, invece, è un'area di memoria separata dalla pila, proprietà del processo in esecuzione, in cui assegnazione deve essere prima richiesto al sistema operativo, e per questo si chiama allocazione dinamica (se non si esegue in un'istruzione if, per esempio, la memoria non può essere allocata per il processo, invece di stack è sempre assegnato).

Solo per fare un esempio finale sul mucchio e pila: in linguaggi come C ++, dichiara int[100] a; alloca staticamente 100 * 8 byte sul (sistema a 64 bit assunto) pila, mentre int* a = new int[100]; dichiara a 8 byte (a 64 bit sistemi) dell'area su stack e le richieste di 800 byte di più sul mucchio, se e dove disponibili.

Ora andiamo parlare di C #:

Pugilato

Dal momento che int è un tipo di valore, ed è allocato sullo stack, quando lanci per oggetto o qualsiasi altro tipo di riferimento (in realtà non c'è è un altro tipo di riferimento da cui int può ereditare, ma è una regola generale) il valore deve diventare necessariamente un tipo di riferimento. Quindi, una nuova area sul mucchio è allocato, l'oggetto è in scatola al suo interno e lo stack contiene un puntatore ad esso.

Unboxing

Proprio il contrario: quando si dispone di un tipo di riferimento, come ad esempio oggetti, e si desidera cast a un tipo di valore, tale da int, il nuovo valore deve essere tenuto in pila, in modo CLR va a heap, < em> Un-box il valore e lo copia dello stack.

In altre parole

Ricordate gli esempi int[] e int*? Semplicemente, quando si dispone di int in C #, il runtime si aspetta la sua posizione stack per contenere il valore , ma invece quando si hanno object, si aspetta il suo valore reale di essere nella posizione mucchio sottolineato dallo stack.

Altri suggerimenti

Ci sono due tipi differenti di .NET Framework.

ValueTypes come int, doppie, singole

ReferenceTypes Lista di array Elenco e molti, molti di più

Le variabili di tipo ValueTypes sono memorizzati in Pila ReferenceTyped variabili sono memorizzate in mucchio

Le variabili di tipo ValueTypes memorizzare il valore ReferenceTyped variabili memorizzare il riferimento ad un valore

quindi se si copia un ValueType variabile - v'è una copia reale di un valore ma se si copia un ReferenceType variabile -. si otterrà un riferimento aggiuntivo per la variabile STESSO

Pugilato nei vostri mezzi questione, che una variabile valueType (ad esempio int) sarà gestito è piaciuto un tipo di variabile di riferimento - .net dà in un nuovo . Così sarà incapsulato all'interno del mucchio e ci sarà di riferimento (s) ad esso.

Nel caso in cui si desidera che il valore di essere di nuovo in una variabile valueType è necessario Unbox è (prendere fuori dalla scatola). Così il valore verrà tolto dal mucchio -. E memorizzati / data al catasta ancora una volta

negozi ArrayList Oggetti solo. Per un riferimento di tipo (come String) questo non è un problema, ma per un ValueType (int, DateTime, ..) è.

Queste valuetypes devono essere convertiti a un oggetto prima di poterli memorizzare come oggetto pianura. Questa "conversione in oggetto" si chiama "boxe" e prende un po 'di tempo.

Quando si legge il valore di schiena, è necessario convertire da Object a int (o quello che era). Questo si chiama "unboxing".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top