Se un'entità sarà immutabile, la questione se usare una struttura o una classe sarà generalmente una prestazione piuttosto che una semantica. Su un sistema a 32/64 bit, i riferimenti di classe richiedono 4/8 byte per l'archiviazione, indipendentemente dalla quantità di informazioni nella classe; la copia di un riferimento di classe richiederà la copia di 4/8 byte. D'altra parte, ogni distintol'istanza di classe avrà 8/16 byte di overhead oltre alle informazioni in suo possesso e al costo della memoria dei riferimenti ad essa. Supponiamo che uno voglia un array di 500 entità, ognuna contenente quattro numeri interi a 32 bit. Se l'entità è un tipo di struttura, l'array richiederà 8.000 byte indipendentemente dal fatto che tutte e 500 le entità siano tutte identiche, tutte diverse o in qualche punto intermedio. Se l'entità è un tipo di classe, l'array di 500 riferimenti richiederà 4.000 byte. Se quei riferimenti puntano tutti a oggetti diversi, gli oggetti richiederebbero 24 byte ciascuno ciascuno (12.000 byte per tutti i 500), per un totale di 16.000 byte, il doppio del costo di archiviazione di un tipo di struttura. D'altra parte, del codice creato un'istanza di oggetto e quindi copiato un riferimento a tutti i 500 slot di array, il costo totale sarebbe di 24 byte per quell'istanza e 4, 000 per l'array: un totale di 4.024 byte. Un grande risparmio. Poche situazioni funzionerebbero così come l'ultima, ma in alcuni casi potrebbe essere possibile copiare alcuni riferimenti in sufficienti slot di array per rendere utile tale condivisione.
Se si suppone che l'entità sia mutabile, la questione se utilizzare una classe o una struttura è in qualche modo più semplice. Supponiamo che "Thing" sia una struttura o una classe che ha un campo intero chiamato x, e si fa il seguente codice:
Cosa t1, t2;
...
t2 = t1;
t2.x = 5;
Si vuole che quest'ultima affermazione influisca su t1.x?
Se Thing è un tipo di classe, t1 e t2 saranno equivalenti, nel senso che anche t1.xe t2.x saranno equivalenti. Pertanto, la seconda istruzione influenzerà t1.x. Se Thing è un tipo di struttura, t1 e t2 saranno istanze diverse, il che significa t1.xe t2.x si riferiranno a numeri interi diversi. Pertanto, la seconda istruzione non influirà su t1.x.
Le strutture mutabili e le classi mutabili hanno comportamenti sostanzialmente diversi, sebbene .net abbia alcune stranezze nella gestione delle mutazioni di struttura. Se si desidera un comportamento di tipo valore (nel senso che "t2 = t1" copierà i dati da t1 a t2 lasciando t1 e t2 come istanze distinte), e se si può vivere con le stranezze nella gestione dei tipi di valore di .net, usare una struttura. Se si desidera una semantica di tipo valore, ma le stranezze di .net porterebbero a una semantica di tipo valore errata nella propria applicazione, utilizzare una classe e borbottare.