type programming number cast .net casting boxing unboxing

.net - programming - type number c#



¿Cuál es la diferencia entre el boxeo/unboxing y el tipo de casting? (5)

¿Cuál es la diferencia entre el boxeo / unboxing y el tipo de casting?

A menudo, los términos parecen usarse indistintamente.


Boxeo significa convertir una variable de tipo de valor (es decir, un entero) a un tipo de referencia. Unboxing es el reverso de eso, usando el tipo de fundición. En el mundo .NET, todo se deriva del tipo "objeto" en pocas palabras.

Por ejemplo (ejemplo C #):

int myInt = 0; // original variable (unboxed to begin with) object boxed = myInt; // box it up int myIntUnBoxed = (int)boxed; // and unbox it again using type casting

El resultado de esto es la unificación del sistema de tipos, lo que permite que los tipos de valores sean tratados como tipos de referencia. Este artículo tiene una mirada más profunda en el boxeo / unboxing.


Boxing / unboxing y type casting son dos operaciones diferentes, sin embargo, usan la misma sintaxis.

Solo se usan indistintamente cuando la persona que habla no sabe lo que realmente está sucediendo ...

El boxeo está almacenando un tipo de valor como un objeto en el montón, y unboxing está leyendo el valor del objeto. Solo puedes destrabar el valor ya que es el tipo exacto.

Casting es cuando convierte un tipo básico a otro tipo básico (como de un int a un long ), o cuando cambia el tipo de una referencia (como de List<int> a IEnumerable<int> ).


El boxeo es el término para convertir un tipo de valor (int, double, float, Guid, etc.) en un tipo de referencia (System.Object, System.String, etc.). Al hacer esta operación de boxeo se asigna memoria en el montón (que el recolector de basura eventualmente tendrá que reclamar). Unboxing es el reverso de este proceso, tomando un tipo de referencia y convirtiéndolo en un tipo de valor.

Casting está tomando un tipo (por ejemplo, System.Object) y lo trata como otro tipo (por ejemplo, System.String).

Cuando coloca algo en C #, lo está enviando a otro tipo. La diferencia es que asigna memoria adicional a medida que se crea un nuevo tipo de referencia .

En pocas palabras: el boxeo es un tipo especial de elenco que convierte un tipo de valor en un tipo de referencia, que requiere la asignación de un nuevo tipo de referencia.


El boxeo se refiere a una conversión de un tipo de valor no anulable en un tipo de referencia o la conversión de un tipo de valor a alguna interfaz que implementa (digamos int a IComparable<int> ). Además, la conversión de un tipo de valor subyacente a un tipo anulable también es una conversión de boxeo. (Advertencia: la mayoría de las discusiones sobre este tema ignorarán los últimos dos tipos de conversiones).

Por ejemplo,

int i = 5; object o = i;

convierte i en una instancia de tipo object

Unboxing se refiere a una conversión explícita de una instancia de object o ValueType a un tipo de valor no anulable, la conversión de un tipo de interfaz a un tipo de valor no anulable (por ejemplo, IComparable<int> a int ). Además, la conversión de un tipo anulable al tipo subyacente también es una conversión de unboxing. (Advertencia: la mayoría de las discusiones sobre este tema ignorarán los últimos dos tipos de conversiones).

Por ejemplo,

object o = (int)5; int i = (int)o;

convierte el entero encerrado en o en una instancia de tipo int .

Un tipo de conversión es una conversión explícita de una expresión a un tipo dado. Así

(type) expression

convierte explícitamente la expression a un objeto de tipo type .


El boxeo y el desempaquetado es un subconjunto de moldes de tipo. El boxeo es el acto de tratar un tipo de valor como tipo de referencia (que en la práctica, implica copiar los contenidos de ese tipo de valor (de la pila) al montón y devolver una referencia a ese objeto). Esto permite pasar un tipo de valor donde se espera un tipo de referencia compatible. También permite que se realicen llamadas a métodos virtuales y otras características de tipos de referencia en el tipo de valor. Unboxing es el reverso de esta operación (recuperar un tipo de valor de un objeto encuadrado).

Tipo de conversión es el término utilizado para cualquier tipo de conversión de una variable de tipo específico a otro. Es un concepto más amplio.

Hace unos minutos, respondí una pregunta relacionada que cubre esta diferencia . Para resumir, categoricé diferentes tipos de instrucciones de IL generadas por C # cast operator:

  1. Boxeo (instrucción IL de la box ) y unbox (instrucción unbox IL)
  2. Casting a través de la jerarquía de inherencia (como dynamic_cast<Type> en C ++, utiliza la instrucción de castclass IL para verificar)
  3. Casting entre tipos primitivos (como static_cast<Type> en C ++, hay muchas instrucciones de IL para diferentes tipos de moldes entre tipos primitivos)
  4. Llamar a los operadores de conversión definidos por el usuario (en el nivel IL solo son llamadas al método apropiado op_XXX ).