2009-07-06 9 views

Respuesta

18

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 cast es el término usado para cualquier tipo de conversión de de una variable de un tipo específico a otro. Es un concepto más amplio.

Hace unos minutos I answered a related question that covers this difference. Para resumir, he categorizado diferentes tipos de instrucciones IL generados por C operador # reparto:

  1. Boxing (box instrucción IL) y unboxing (unbox instrucción IL)
  2. de reparto a través de la jerarquía inhertiance (como dynamic_cast<Type> en C++, los usos castclass instrucción IL para verificar)
  3. conversión entre tipos de primitivas (como static_cast<Type> en C++, hay un montón de instrucciones IL para diferentes tipos de moldes entre los tipos primitivos)
  4. Llamar operadores de conversión definidas por el usuario (en la lev IL ellas son solo llamadas de método al método apropiado op_XXX).
+3

Eso no me ayuda demasiado. Creo que investigaré un poco en internet para encontrar definiciones específicas para comparar. –

+1

No diría que el boxeo/unboxing son un subconjunto de casting en absoluto. Se trata de mover tipos de valores a tipos de referencia, para que puedan ser alterados/almacenados en otro lugar. Where-as casting es el proceso de volver a interrumpir un tipo de referencia. –

+0

@Simeon: desde una perspectiva de diseño de idioma, * en caja * es solo un tipo diferente y está convirtiendo entre diferentes tipos. –

14

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.

La conversión 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 cuando se crea un nuevo tipo de referencia.

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

+0

¡Gracias! ¡Este es el tipo de respuesta que estoy buscando! –

+2

Heap es un detalle de implementación. – jason

+1

¡Ese detalle 'montón' realmente me ayuda a entenderlo mejor! –

4

El boxeo/unboxing y el tipo de fundido son dos operaciones diferentes, sin embargo, usan la misma sintaxis.

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

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

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

+1

Yo * sé * que. ¡Pregunto cuáles son las diferencias! –

+1

¡Gracias! ¡Eso es lo que estaba buscando! –

38

El boxeo hace referencia a una conversión de un tipo de valor no anulable a 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 dos últimos tipos de conversiones.)

Por ejemplo,

int i = 5; 
object o = i; 

convierte i a una instancia de tipo object.

Unboxing se refiere a una conversión explícita de una instancia de object o ValueType a un tipo no anulable-valor, la conversión de un tipo de interfaz a un tipo no anulable-valor (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: Los más discusión de este tema ignorará los dos últimos tipos de conversiones.)

Por ejemplo,

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

convierte el entero en caja en o a una instancia de tipo int.

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

(type) expression 

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

+0

Gracias. No parece haber un lenguaje estándar sobre estas cosas. –

+10

Hay un lenguaje muy estándar sobre estas cosas. Consulte la Especificación del lenguaje C#, ECMA # 334. – jason

+10

Para mayor claridad, cuando Jason dice "la conversión de un tipo de valor subyacente a un tipo __nullable__ también es una conversión de boxeo" lo que quiere decir con "tipo nullable" es un tipo de Referencia, que puede establecerse en nulo, de ahí su uso de el término "nullable". Lo que NO quiere decir es el tipo 'Nullable '. Convertir un tipo de valor en un 'Nullable ' (también conocido como 'T?') NO es un ejemplo de boxeo/unboxing porque no se crea ningún tipo de referencia. Por ejemplo 'int? x = 5' es un ejemplo de un elenco de tipo, NO de boxeo. – ricovox

3

Boxing 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 (C# ejemplo):

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 llevar de esto es la unificación del sistema de tipos, permitiendo de valor tipos para ser tratados como los tipos de referencia. This article tiene una mirada más profunda en el boxeo/unboxing.

+0

¿El lenguaje básico no siempre ha permitido que los tipos de valor/referencia sean tratados de la misma manera? ¿Es esto algo específico de C#? –

+0

(es decir, Variantes) –

+0

Se podría decir que la idea de boxeo/unboxing provino del lenguaje Básico (preVB.NET que es). No se limita a C#, ya que los mismos conceptos se pueden aplicar a VB.NET o cualquier otro lenguaje que se dirija al tiempo de ejecución de .NET. Ha pasado mucho tiempo desde que codifiqué el lenguaje básico ... ah los recuerdos. – ajawad987

Cuestiones relacionadas