2010-06-05 10 views
5
var i = new int[2]; 

¿Se considera que "caja" está en la caja?Boxeo y Unboxing

+1

¿Qué idioma? DO#? – kennytm

+0

En lenguaje C#. – Vivek

+1

@MarkRushakoff :) Sé que esta es una publicación anterior, pero me reí de ganas, en realidad derramé un poco de café :))) –

Respuesta

4

La matriz en C# es de tipo referencial, por lo que no es necesario el uso del boxeo. sin embargo tendrá el boxeo en este ejemplo:

var i = 123; 
object o = i; 
7

Asumiendo que esto es C# (var y C# -como la sintaxis de matrices), no, no se i en caja. Solo los tipos de valores primitivos (piense en valores numéricos) pueden encasillarse.

Los valores de la matriz tampoco están encuadrados, ya que los valores de las matrices primitivas no aparecen encuadrados.

+1

Puedes guardar cualquier estructura, incluidas las que escribes tú mismo, así que el boxeo es un poco más de largo alcance de lo que esto implica. Los tipos de valor se implementan en .NET como estructuras. – Donnie

9

No hay nada que guardar. La palabra clave var no significa que la variable esté en formato boxx. No realiza ninguna conversión durante el tiempo de ejecución. La palabra clave var es estrictamente una construcción C#. Lo que está sucediendo cuando se utiliza var es:

var i = new int[1]; 

IL ve como:

int[] i = new int[1] 

Ahora bien, si usted está preguntando si cuando se asigna un entero a una parte de la matriz de i lo hace caja ? No

i[0] = 2; 

no lo hace:

como

.

Esto se opone a las que no:

var o = new object[1]; 

o[0] = 2; 

Este ejemplo y por qué utilizar ArrayList (piense matriz expansible) en 1.0, 1.1 (genéricos pre) fue un enorme costo. El siguiente comentario se aplica al ejemplo object[] así:

Cualquier tipo de referencia o valor que es añade a un ArrayList es implícitamente upcast a objeto. Si los elementos son tipos de valor , se deben incluir cuando se haya agregado a la lista y se haya eliminado cuando se recupere . Tanto la fundición como las operaciones de boxeo y desembalaje degradan el rendimiento; el efecto de boxeo y unboxing puede ser bastante significativo en los casos en que itere en colecciones grandes.

MSDN Link to ArrayList

Link to Boxing in C#

3

Boxing sólo se produce cuando una (es decir, un tipo primitivo, struct o enumeración) value type está siendo tratado como un tipo de referencia. Su matriz está declarada para contener valores del tipo int. El var keyword simplemente le dice al compilador que infiera el tipo de variable i, en lugar de tener que especificarlo manualmente.

te hicieron por escrito:

var i = new object[2]; 

El compilador que se traduciría a object[] i = new object[2], y cualquier int valores que poner ahí estaría en caja. Cualquier tipo de referencia que pongas en la misma matriz no necesitaría ningún boxeo.

En resumen, var no tiene nada que ver con el boxeo.

Aquí hay diagram of different types en .NET. También es posible que desee leer .NET Type fundamentals.

Cuestiones relacionadas