2011-01-09 12 views
11

¿Por qué son tipos de referencia de interfaces? Por lo que yo entiendo, una interfaz es un contrato entre clases (o estructuras), entonces ¿por qué es un tipo en absoluto? Hubiera pensado que no es un tipo de valor o un tipo de referencia.¿Por qué hay interfaces en tipos de referencia .Net?

+0

¿Por qué dices que una interfaz es un tipo de referencia? –

+0

Bueno, solo estaba tomando un examen de práctica por 70-536, y decía que las interfaces son una de las cosas que son un tipo de referencia (junto con las clases y los delegados). – richard

+3

@nader it ** es ** un tipo de referencia ... –

Respuesta

10

Para tratarse como una estructura, el compilador debe saber en tiempo de compilación cuál es el tipo de hormigón, para reservar el espacio correcto en la pila. Esto significa que incluso si una estructura implementa IFoo, luego con:

var ms = new MyStruct(); 
IFoo foo = ms; 

entonces la asignación a foo es una operación de boxeo. Se podría decir que "el compilador debe detectar que solo es un foo y usar el código de operación 'constatado', pero en el caso general (con múltiples asignaciones a foo etc.) esto no es posible (me atrevería a adivinar) que golpeará el "problema de detención").

También hay un problema de llamada virtual vs estática, pero el código de operación "restringido" funciona alrededor de eso.

Básicamente, cualquier uso de la interfaz siempre se debe tratar como una referencia.

Hay una excepción a esto: restricciones genéricas.

Si tiene

static void DoBar<T>(T target) where T : IFoo { 
    target.Bar(); 
} 

aquí el método es compilados JIT-una vez por tipo de valor, por lo que la pila-espacio necesario para Tes conocido; la llamada a Bar está "restringida" y puede ser virtual o estática automáticamente según sea necesario.

+0

Ok, lo entiendo. Así que MyStruct implementa foo, y sigue siendo un tipo de valor. Pero una vez que lanzas MyStruct a foo, está encuadrado. El comportamiento de foo lo convierte en un tipo de referencia. Además, a foo se le podría asignar un tipo de valor y luego un tipo de referencia, nunca se sabe, así que tiene que comportarse como un tipo de referencia para cubrir todos los escenarios ... ¿Es esto correcto? – richard

+1

@Richard todo correcto, sí. –

3

Son tipos de referencia porque los tipos de valor tienen un tamaño fijo en tiempo de compilación, por lo que se pueden asignar en la pila. Los tipos de referencia son punteros, por lo que los punteros son de tamaño constante pero pueden señalar a memoria de cualquier tamaño.

Cuestiones relacionadas