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