2009-07-30 31 views

Respuesta

12

Básicamente, es un tramposo ;-P

Cualquier struct (es decir, nada heredado de ValueType) se trata con la semántica de tipo valor. Pero hay una conversión de box a object según sea necesario; lo que significa que si echas un struct a un object, creará un objeto especial (en el montón administrado) que contenga los datos (como un clon) de tu valor *.

La versión en caja es un tipo de referencia. Puede desempaquetar esto (mediante conversión) de nuevo a la versión struct, que invierte esto (copia los datos de los clones del objeto en el montón en su valor local).


* = a no ser que se trata de un vacío Nullable<T>, cuales cajas para null; del mismo modo, null unboxes a un Nullable<T> vacío.

+0

¿Puede explicarme o señalar un enlace sobre cómo está sucediendo la magia (trampa)? es decir, Struct es un tipo de valor mientras que el tipo de referencia de objeto – skjagini

+0

@skjagini - simplemente, el compilador y el tiempo de ejecución pueden detectar fácilmente que algo se deriva de 'ValueType', y tratarlo de manera diferente ... ¿Más allá de eso? ECMA335 –

+0

+1 Aunque los lenguajes como C# pretenden que una estructura enmarcada es un tipo de valor, dentro de las entrañas del CLR cada tipo de valor gestionado tiene un tipo de clase correspondiente que encapsula un campo del tipo de valor correspondiente y envuelve a todos los miembros Ese campo. Incluso si la especificación del lenguaje C# llama a tal cosa un tipo de valor, se comportará como un tipo de referencia. – supercat

Cuestiones relacionadas