¿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?
Respuesta
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 T
es conocido; la llamada a Bar
está "restringida" y puede ser virtual o estática automáticamente según sea necesario.
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
@Richard todo correcto, sí. –
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.
- 1. ¿Hay interfaces compartidas por tipos de valores que representan números?
- 2. ¿Por qué no hay interfaces finales en Java?
- 3. ¿Por qué son tipos de referencia de punteros?
- 4. ¿Por qué no hay una interfaz "configurada" en .NET Framework?
- 5. Tipos genéricos vs Clase abstracta/Interfaces
- 6. .NET Paso de parámetros - por referencia v/s por valor
- 7. ¿Por qué estamos implementando interfaces?
- 8. Tipos de referencia
- 9. ¿Por qué no hay "referencia NULL" en C++?
- 10. Colecciones de Java. ¿Por qué no hay tipos primitivos?
- 11. ¿Por qué no hay tipos de punto flotante sin signo?
- 12. ¿Por qué debería crear interfaces en PHP?
- 13. ¿Por qué necesitamos interfaces en Java?
- 14. ¿Por qué hay un booleano de 4 bytes en .NET?
- 15. Pasar tipos de referencia por valor en C#
- 16. ¿Por qué implementamos las interfaces recursivamente?
- 17. Tipos de concreto o interfaces para tipos de devolución?
- 18. Tipos de referencia no anulables
- 19. interfaces Java y tipos devueltos
- 20. ¿Por qué no hay una referencia OFICIAL de JavaScript?
- 21. ¿Por qué no objetar excepciones de error de referencia en .net dime qué objeto era nulo?
- 22. ¿Por qué 2 tipos de AppFabric?
- 23. ¿Por qué no hay SortedList <T> en .NET?
- 24. ¿Por qué no hay CallerTypeNameAttribute en .NET 4.5?
- 25. ¿Por qué no hay una cola genérica sincronizada en .NET?
- 26. Valor y tipos de referencia
- 27. ¿Por qué Java prohíbe la herencia de interfaces internas?
- 28. ¿Por qué crear clases e interfaces abstractas?
- 29. ¿Los tipos de referencia son tipos anulables?
- 30. Derivación de interfaces COM en .NET
¿Por qué dices que una interfaz es un tipo de referencia? –
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
@nader it ** es ** un tipo de referencia ... –