sharp - ¿Por qué las estructuras de C#no se pueden heredar?
herencia polimorfismo y encapsulamiento en c# (3)
Esta pregunta ya tiene una respuesta aquí:
- ¿Por qué las estructuras no admiten la herencia? 10 respuestas
Estoy leyendo CLR a través de C # por Jeffery Richter y dice que una estructura es un tipo de valor y no se puede heredar.
¿Hay alguna razón técnica o filosófica?
Editar: Aparentemente hay serias preocupaciones editoriales sobre esta publicación. Ver la sección de comentarios.
Un poco de ambos.
Filosóficamente , funciona: hay clases, que son el bloque de construcción "real" para la programación orientada a objetos, y hay estructuras, que son tipos de datos livianos para el almacenamiento, pero que permiten el método similar a un objeto para mayor familiaridad y conveniencia.
Técnicamente , ser un "tipo de valor" significa que toda la estructura, es decir, todos sus contenidos, se almacenan (generalmente) dondequiera que tenga una variable o miembro de ese tipo. Como variable local o parámetro de función, eso significa en la pila. Para las variables miembro, eso significa almacenado por completo como parte del objeto.
Como ejemplo (principal) de por qué la herencia es un problema, considere cómo el almacenamiento se ve afectado a un nivel bajo si permite que las estructuras tengan subtipos con más miembros. Cualquier cosa que guarde ese tipo de estructura ocuparía una cantidad variable de memoria basada en qué subtipo terminó conteniendo, lo que sería una pesadilla de asignación. Un objeto de una clase dada ya no tendría un tamaño constante conocido en el momento de la compilación, y lo mismo sería cierto para los cuadros de pila de cualquier llamada a un método. Esto no ocurre con los objetos, que tienen almacenamiento asignado en el montón y en su lugar tienen referencias de tamaño constante a ese almacenamiento en la pila o dentro de otros objetos.
Esta es solo una explicación intuitiva de alto nivel: consulte los comentarios y otras respuestas para obtener información más detallada y más detallada.
Porque es la forma en que las estructuras están representadas en .NET. Son tipos de valores y tipos de valores que no tienen un puntero de tabla de método que permita la herencia.
Puede encontrar las respuestas a SO Pregunta ¿Por qué están sellados los tipos de valor de .NET? pertinente. En él, @logicnp refiere a ECMA 335 , que dice:
8.9.10 Herencia de tipo de valor
- [...]
- Se sellará para evitar lidiar con las complicaciones del corte de valores.
- Las reglas más restrictivas especificadas aquí permiten una implementación más eficiente sin comprometer seriamente la funcionalidad.