2009-08-31 10 views
5

.NET tenemos tipos de datos primitivos como int y tipos de valores como struct.Cómo .NET diferencia los tipos de referencia frente a primitivo y de valor

Y también tenemos tipos de referencia. Todos ellos parecen derivarse de la clase de objeto.

¿Cómo determina .NET el tipo de valor primitivo frente al tipo de referencia?

¿Dónde se hace? ¿En el compilador o en JIT?

¿Esto pertenece a las capacidades de los compiladores?

+0

Lo siento, pero no entiendo muy bien su pregunta. –

Respuesta

11

Todos los tipos de valores, incluidas las primitivas integradas del Sistema de tipos comunes (CTS), derivan DIRECTAMENTE del tipo de CTS "System.ValueType", (excepto las enumeraciones).

Por lo tanto, el compilador puede decir mediante el examen del tipo de base de cualquier tipo. Si es "System.ValueType", entonces es un tipo de valor; de lo contrario, es un tipo de referencia.

Editar: enumeraciones, como en

public Enum Shipper {FedEx, Aerborne, USPS, Stork} 

... no se derivan directamente de System.ValueType, derivan de System.Enum, que deriva de System.ValueType ...

+0

Excepto por 'System.Enum', que se deriva de' System.ValueType' pero no es un tipo de valor en sí mismo. Pero todos los tipos 'enum' * son * tipos de valores que se derivan de' System.Enum' haciendo que su tipo base no sea 'System.ValueType'. Entonces, los tipos de valores son tipos derivados de 'System.ValueType' a excepción de' System.Enum', aunque la implementación interna de esta prueba se puede realizar de manera más eficiente que esta. –

+0

Gracias Charles. ¿Java funciona de manera similar? –

+0

@ 280Z28: No estoy seguro de lo que eso significa, ya que System.Enum no es un tipo que puede usar directamente. De hecho, ni siquiera es lo suficientemente real como para usarlo como una restricción en un tipo genérico (ver la parte inferior de http://msdn.microsoft.com/en-us/library/d5x73970.aspx). –

2

Los tipos de valores en realidad se derivan de System.ValueType que a su vez se deriva de System.Object.

2

Valor los tipos se derivan de System.ValueType, que, entre otras cosas, proporciona una implementación predeterminada (pero lenta) de GetHashCode y Equals. (Son lentos porque usan el reflejo).

Los tipos primitivos como int pueden encajonarse en tipos de valores en IL utilizando la instrucción box. Tienen instrucciones especiales de IL para trabajar con ellos.

Los tipos de referencia son todas las otras clases.

También hay punteros, que se pueden utilizar en el código unsafe y no derivan del object en absoluto. EDITAR - proof.

+0

¿Está seguro de que los tipos de puntero no se derivan de IntPtr? –

+0

Sí, no tienen ninguna relación. Por un lado, 'IntPtr' es una estructura, y no se puede derivar de una estructura. – SLaks

Cuestiones relacionadas