Cada definición de un tipo derivado de ValueType define realmente dos tipos distintos de cosas en el tiempo de ejecución: un tipo de objeto montón (que deriva de ValueType
y en pasar de Object
, y que contiene información de tipo incrustado), y un tipo de ubicación de almacenamiento (que no contiene información de tipo incrustado, sino que requiere que el código que lo utiliza debe tener algún otro medio para saber de qué se trata). Una instancia del tipo de objeto de montón contiene un campo del tipo de ubicación de almacenamiento, y el código que intenta acceder al this
accederá a ese campo. Si un tipo de valor se convierte implícita o explícitamente en una ubicación de almacenamiento de tipo de referencia, el sistema creará un nuevo objeto de montón con el tipo apropiado y copiará todos los campos públicos y privados del tipo de valor en los campos correspondientes dentro del objeto de montón. Si un objeto de montón se convierte en una ubicación de almacenamiento de tipo de valor, todos los campos públicos y privados del objeto de montón se copiarán en la ubicación de almacenamiento de tipo de valor.
Si se intenta utilizar cualquier Object
o método de interfaz en un objeto de montón de un tipo de valor, el método se llamará igual que cualquier otro método de objeto de montón. Si el intento se realiza en una ubicación de almacenamiento de tipo valor, para cualquier método que no sea GetType
, el compilador generará un código de operación "restringido" especial que informará el tiempo de ejecución del tipo de ubicación de almacenamiento e indicará a Runtime que llame a la dirección de el método apropiado para ese tipo. Como el compilador tendrá el tipo de ubicación de almacenamiento disponible, y el tiempo de ejecución puede usarlo para encontrar el método apropiado, el método apropiado puede invocarse directamente en la ubicación de almacenamiento, sin tener que crear primero un nuevo objeto de montón. GetType
es la única excepción notable; dado que funciona al examinar la información de tipo incrustada en un objeto, solo puede funcionar en elementos que tienen información de tipo incrustada. En consecuencia, su argumento se convertirá a la forma de objeto de montón antes de la llamada; GetType
podrá examinar la información de tipo incrustado de ese objeto de montón.
todos los tipos derivan de Object de alguna manera. int deriva de ValueType que deriva de Object. Tu suposición 2 es incorrecta. http://ptgmedia.pearsoncmg.com/images/chap13_0321169514/elementLinks/13fig02.gif – 0lukasz0
@ 0lukasz0 [No * todo * se deriva del objeto] (http://blogs.msdn.com/b/ericlippert/archive/2009/ 08/06/not-everything-derives-from-object.aspx). – vcsjones
"struct Int32 reemplaza el método ValueType.ToString()" responde a su propia pregunta. –