La réponse de Svick est bonne, mais j'ai pensé ajouter quelques points supplémentaires.
Tout d'abord, le paragraphe est défectueux. Les types de pointeur n'héritent pas de l'objet. Les valeurs qui sont au moment de la compilation connues pour être des types d'interface ou des types de paramètres de type seront, lors de l'exécution, soit des références non valides, soit des instances authentiques de quelque chose qui hérite de l'objet, mais il m'a toujours été étrange de dire que ces types " hériter "de l'objet; l'héritage est la propriété que les membres de l'ancêtre sont membres du descendant, mais vous ne pensez normalement pas à "ToString" comme étant un membre de IEnumerable. Vous pensez que c'est un membre de la chose qui implémente IEnumerable .
Le paragraphe est également défectueux car c'est le seul endroit où "type primitif" apparaît dans la spécification, et il apparaît sans définition. Il est donc à la fois inutile et déroutant et doit être supprimé.
Je veux que ce paragraphe soit corrigé depuis un moment. La prochaine fois que je verrai Mads, je lui rappellerai.
Pour répondre à votre question spécifique: svick est bien sûr correct, mais il est utile de voir un exemple spécifique. Quand tu dis:
struct ColorfulInt
{
int value;
Color color;
...
}
et vous créez, disons, un tableau:
ColorfulInt[] x = new ColorFulInt[100];
Ensuite, le stockage de ces 100 pouces et 100 couleurs va dans le tableau lui-même . Si ColorfulInt était plutôt une classe, le tableau contiendrait 100 références à ColorfulInt, chacune devant être allouée individuellement. L'allocation individuelle de ces cent éléments est beaucoup moins efficace à la fois dans le temps et dans l'espace que la simple allocation du stockage directement dans le tableau lui-même.