Pregunta

A partir de MSDN leí que el boxeo / unboxing es para tratar valor tipos como objetos. Pero cuando leí acerca de ArrayList, se lee que no boxeo también. Así que estoy bastante confundido en cuanto ArrayList tiene un valor y tipos de referencia como objetos. También los siguientes no se unboxing en cuanto a la terminología, es sólo casting?

ArrayList a=new ArrayList();
a.Add(someClass);

someClass x=(someClass)a[0];
¿Fue útil?

Solución

ArrayList realiza boxeo para los tipos de valor, pero no los tipos de referencia. O mejor dicho, ArrayList en sí no hace el boxeo - el compilador hace. Por ejemplo:

ArrayList list = new ArrayList();
list.Add(5);

es efectivamente

ArrayList list = new ArrayList();
object boxed = 5; // Perform boxing from value type type
list.Add(boxed);

Su ejemplo es de hecho simplemente echando - una conversión de referencia, no una conversión unboxing. no necesita un valor de tipo de referencia para ponerlas a ser almacenados en una ArrayList -. ya es una referencia

Una vez más, eso es cierto de boxeo en general y no específica a ArrayList. El boxeo es sólo una manera de utilizar un valor de tipo de valor donde realmente ¿Quieres una referencia ... una referencia tiene que ser a un objeto, por lo que el CLR crea un objeto a envolver el valor de tipo de valor, y devuelve una referencia a que la envoltura (la "caja" almacenar el valor).

Otros consejos

boxeo / unboxing es una característica de la lengua y el tiempo de ejecución, no es una característica de ArrayList. En términos generales, que es la conversión de un tipo de valor desde / hasta el tipo Object , y desde ArrayList toma en Objects, cualquier tipo de valor que pasa en cajas serán automáticamente con la instrucción box IL.

Más específicamente, el boxeo / unboxing implica la creación o el examen de un nuevo objeto, y la copia de los datos del tipo de valor de la pila a la pila (o viceversa). Es bastante caro, y que le gustaría evitar si es posible.

En el caso de los tipos de referencia, no hay código de boxeo se genera normalmente; cualquier instrucción unbox que funciona en un tipo de referencia está, además, simplemente ignorado.

Me resulta útil pensar en los tipos de valor como fuera del sistema de tipo de clase, pero considero cada tipo de valor como teniendo un correspondiente tipo de referencia invisible derivado de ValueType (que a su vez deriva de objeto) que se comporta esencialmente como una clase con los mismos miembros que Foo, pero apoya ampliación moldes desde y hacia el tipo de valor real.

Si un tipo de valor se pasa al código que espera un derivado del objeto, será fundido al tipo de referencia invisible apropiado; Si un objeto de ese tipo de referencia se asigna a una variable del tipo de valor, será de nuevo fundido.

Por cierto, si yo pudiera elegir, no habría alguna manera de especificar que algo que no sea el método de moldeo por defecto se debe utilizar, pero no existe tal función.

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