Necesita interpretación de la sección en la especificación de C #

11

Estoy leyendo la especificación C # . Podría usar la aclaración en un segmento:

C # tiene un sistema de tipo unificado. Todos los tipos de C #, incluidos los tipos primitivos como int y double, heredan de un único tipo de objeto raíz. Por lo tanto, todos los tipos comparten un conjunto de operaciones comunes, y los valores de cualquier tipo se pueden almacenar, transportar y operar de manera coherente. Además, C # admite tipos de referencia y valores definidos por el usuario, lo que permite la asignación dinámica de objetos, así como el almacenamiento en línea de estructuras ligeras.

¿Qué significa "almacenamiento en línea de estructuras ligeras" en este contexto?

ChuckT
fuente

Respuestas:

11

La respuesta de Svick es buena, pero pensé que agregaría algunos puntos extra.

En primer lugar, el párrafo es defectuoso. Los tipos de puntero no heredan del objeto. Los valores que en tiempo de compilación se sabe que son tipos de interfaz o tipos de parámetros de tipo, en tiempo de ejecución, serán referencias no válidas o instancias de buena fe de algo que hereda del objeto, pero siempre me ha parecido extraño decir que estos tipos " heredar "del objeto; la herencia es la propiedad de que los miembros del antepasado son miembros del descendiente, pero normalmente no piensas en "ToString" como miembro de IEnumerable. Piensas que es un miembro de lo que implementa IEnumerable .

El párrafo también es defectuoso porque este es el único lugar donde aparece "tipo primitivo" en la especificación, y aparece sin definición. Por lo tanto, es innecesario y confuso y debe eliminarse.

He querido que este párrafo se arregle por un tiempo. La próxima vez que vea a Mads se lo recordaré.

Para abordar su pregunta específica: svick es, por supuesto, correcto, pero es útil ver un ejemplo específico. Cuando tu dices:

struct ColorfulInt
{
    int value;
    Color color;
    ...
}

y creas, digamos, una matriz:

ColorfulInt[] x = new ColorFulInt[100];

Luego, el almacenamiento para esos 100 ints y 100 Colors va en la matriz misma . Si ColorfulInt fuera en su lugar una clase, la matriz contendría 100 referencias a ColorfulInt, cada una de las cuales tendría que asignarse individualmente. Asignar individualmente esos cien elementos es mucho menos eficiente en tiempo y espacio que simplemente asignar el almacenamiento directamente en la matriz misma.

Eric Lippert
fuente
Entonces, ¿es la importancia en la abstracción de la memoria de esos objetos, donde cuando estás listo para manipularlos es más fácil acceder si están en un bloque contiguo de punteros de versos espaciales direccionables a quién sabe dónde? ¿Es correcto o todavía me falta algo?
ChuckT
@ChuckT: Correcto. No paga la sobrecarga de la indirección, y también obtiene una buena ubicación de caché.
Eric Lippert
12

Significa que los tipos de valor se almacenan directamente donde los define, lo que los hace más eficientes en comparación con los tipos de referencia.

¿Qué significa eso exactamente? Si tiene una variable local de un tipo de valor, generalmente se almacenará directamente en la pila (pero hay muchas excepciones). Si tiene un campo de un tipo de valor, se almacenará directamente en la clase o estructura adjunta.

svick
fuente
1
Eso tiene sentido. ¡Gracias por darme todo eso, svick!
ChuckT