La risposta di Svick è buona, ma ho pensato di aggiungere qualche punto in più.
Prima di tutto, il paragrafo è imperfetto. I tipi di puntatore non ereditano dall'oggetto. I valori che sono noti al momento della compilazione come tipi di interfaccia o tipi di parametro di tipo saranno, in fase di esecuzione, riferimenti non validi o istanze in buona fede di qualcosa che eredita dall'oggetto, ma mi ha sempre strutturato come strano dire che questi tipi " ereditare "dall'oggetto; l'ereditarietà è la proprietà che i membri dell'antenato sono membri del discendente, ma normalmente non si considera "ToString" come un membro di IEnumerable. Lo pensi come un membro della cosa che implementa IEnumerable .
Anche il paragrafo è imperfetto perché questo è l'unico posto in cui "tipo primitivo" appare nelle specifiche e appare senza definizione. È quindi inutile e confuso e dovrebbe essere rimosso.
Ho voluto che questo paragrafo venisse corretto per un po '. La prossima volta che vedrò Mads glielo ricorderò.
Per rispondere alla tua domanda specifica: svick è ovviamente corretto ma è utile vedere un esempio specifico. Quando dici:
struct ColorfulInt
{
int value;
Color color;
...
}
e crei, diciamo, un array:
ColorfulInt[] x = new ColorFulInt[100];
Quindi l'archiviazione per quei 100 pollici e 100 colori va nell'array stesso . Se ColorfulInt fosse invece una classe, l'array conterrebbe 100 riferimenti a ColorfulInt, ognuno dei quali dovrebbe essere allocato individualmente. L'allocazione individuale di questi cento elementi è molto meno efficiente sia nel tempo che nello spazio rispetto alla semplice allocazione dell'archiviazione nell'array stesso.