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.