Pregunta

Posibles duplicados:
¿Por qué necesitamos boxeo y unboxing en C#?
¿Qué es el boxeo y el unboxing y cuáles son los comerciales?

En C# ¿Qué significa Sit Sit: "Box and Unbox"?

Aquí un extracto de MSDN donde fundé el texto.

Pero esta conveniencia tiene un costo. Cualquier referencia o tipo de valor que se agregue a una lista de matrices está implícitamente en el objeto. Si los elementos son tipos de valor, deben estar en caja cuando se agregan a la lista y se desaniman cuando se recuperan. Tanto el casting como las operaciones de boxeo y unboxing disminuyen el rendimiento; El efecto del boxeo y el desempeño puede ser muy significativo en escenarios en los que debes iterar sobre grandes colecciones.

¡Gracias!

¿Fue útil?

Solución

Aquí hay una explicación más detallada que analiza el tiempo de ejecución del lenguaje interno del lenguaje común.

Primero, hagamos la diferencia entre tipos de valor y tipos de referencia:

  • Se mantiene un tipo de valor en el pila y una copia se pasa a los métodos llamados
  • Se mantiene un valor de referencia en el montón administrado y la pila contiene solo un puntero (referencia) a su ubicación. La ubicación, y no el objeto, se pasa a los métodos llamados

Si no sabe cuál es la pila (no se ofenda), es un área de memoria que contiene variables locales en un método y direcciones de funciones de llamadas utilizadas para return instrucción (solo para ser breve y proporcionar una respuesta general). Cuando llamas a un método, un área suficiente en la pila es inactivamente Asignada a él, por lo que la asignación de pila siempre se llama asignación estática.

El montón, en cambio, es un área de memoria separada de la pila, propiedad del proceso de ejecución, en el que se debe exigir la asignación al sistema operativo, y es por eso que se llama asignación dinámica (Si no se ejecuta en una declaración IF, por ejemplo, la memoria puede no asignarse para su proceso, en su lugar, la pila siempre se asigna).

Solo para hacer un ejemplo final en Heap y Stack: en idiomas como C ++, declarando int[100] a; Estadicalmente asigna 100*8 bytes en la pila (asumido del sistema de 64 bits), mientras que int* a = new int[100]; Declara un área de 8 bytes (en sistemas de 64 bits) en la pila y solicita 800 bytes más en el montón, si y dónde están disponibles.

Ahora hablemos de C#:

Boxeo

Dado que int es un tipo de valor, y se asigna en la pila, cuando lo lanza a objetos o cualquier otro tipo de referencia (en realidad, no hay otro tipo de referencia del cual INT pueda heredar, pero es una regla general) el valor debe volverse necesariamente un tipo de referencia. Entonces se asigna una nueva área en el montón, el objeto es en caja Dentro de él y la pila tiene un puntero.

Desempaquetado

Todo lo contrario: cuando tienes un tipo de referencia, como el objeto, y quieres lanzarlo a un tipo de valor, como int, el nuevo valor debe mantenerse en la pila, por lo que CLR va a Heap, sin cajas el valor y lo copia en la pila.

En otras palabras

Recuerda el int[] y int* ¿Ejemplos? Simplemente, cuando tienes int En C#, el tiempo de ejecución espera que su ubicación de pila mantener el valor Pero en su lugar cuando tienes object, espera que su valor real esté en la ubicación del montón señalada por la pila.

Otros consejos

Hay dos tipos diferentes en .NET Framework.

Valueetiposcomo int, doble, single

ReferenciaLista de ArrayList y muchos, muchos más

Variables de tipo Valueetipos se almacenan en pilaReferenciado Las variables se almacenan en Heap

Variables de tipo Valueetipos almacenar el valorReferenciado Las variables almacenan la referencia a un valor

Entonces, si copia un Tipo de valor variable: hay un copia real de un valor pero si copia un Tipo de referencia variable: obtendrás un referencia adicional a la misma variable.

El boxeo en su pregunta significa que una variable valueType (por ejemplo) se manejará como una variable de tipo de referencia. .NET le da a una nueva caja. Por lo tanto, se encapsulará dentro del montón y habrá referencias (s) de él.

En caso de que desee que el valor vuelva a estar en una variable valueType que tiene que descifrar eso (sácalo de la caja). Por lo tanto, el valor se sacará del montón, y se almacenará/se administrará a la pila una vez más.

ArrayList almacena solo objetos. Para un tipo de referencia (como String) Esto no es un problema, sino para un valueType (int, dateTime, ..) es.

Estos valuetypes deben convertirse en un objeto antes de poder almacenarlos como objeto simple. Esta "convertir al objeto" se llama "boxeo" y toma un poco de tiempo.

Cuando le devuelve el valor, debe convertir de objeto a int (o lo que sea). Esto se llama "Unboxing".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top