Wenn eine Entität unveränderlich sein soll, ist die Frage, ob eine Struktur oder eine Klasse verwendet werden soll, im Allgemeinen eher eine Frage der Leistung als der Semantik. Auf einem 32/64-Bit-System benötigen Klassenreferenzen 4/8 Bytes zum Speichern, unabhängig von der Menge der Informationen in der Klasse; das Kopieren einer Klassenreferenz erfordert das Kopieren von 4/8 Bytes. Auf der anderen Seite wird jede deutlich Klasseninstanz hat 8/16 Bytes Overhead zusätzlich zu den Informationen, die sie enthält, und den Speicherkosten der Verweise auf sie. Angenommen, man möchte ein Array von 500 Entitäten, die jeweils vier 32-Bit-Ganzzahlen enthalten. Wenn es sich bei der Entität um einen Strukturtyp handelt, benötigt das Array 8.000 Byte, unabhängig davon, ob alle 500 Entitäten identisch, alle unterschiedlich oder irgendwo dazwischen sind. Handelt es sich bei der Entität um einen Klassentyp, benötigt das Array mit 500 Referenzen 4.000 Bytes. Wenn diese Verweise alle auf unterschiedliche Objekte verweisen, würden die Objekte jeweils weitere 24 Byte benötigen (12.000 Byte für alle 500), insgesamt also 16.000 Byte - das Doppelte der Speicherkosten eines Strukturtyps. Würde der Code hingegen eine Objektinstanz erstellen und dann einen Verweis auf alle 500 Array-Slots kopieren, so würden die Gesamtkosten 24 Byte für diese Instanz und 4.000 Byte für das Array betragen - insgesamt 4.024 Byte. Eine große Ersparnis. Nur wenige Situationen würden so gut funktionieren wie die letzte, aber in einigen Fällen kann es möglich sein, einige Referenzen auf genügend Array-Slots zu kopieren, damit sich eine solche gemeinsame Nutzung lohnt.
Wenn die Entität veränderbar sein soll, ist die Frage, ob eine Klasse oder eine Struktur verwendet werden soll, in gewisser Weise einfacher. Nehmen wir an, "Thing" ist entweder ein struct oder eine Klasse, die ein Integer-Feld namens x hat, und man macht den folgenden Code:
Thing t1,t2;
...
t2 = t1;
t2.x = 5;
Soll sich die letztgenannte Aussage auf t1.x auswirken?
Wenn Thing ein Klassentyp ist, sind t1 und t2 äquivalent, d. h. t1.x und t2.x sind ebenfalls äquivalent. Wenn Thing ein Strukturtyp ist, sind t1 und t2 unterschiedliche Instanzen, d.h. t1.x und t2.x beziehen sich auf unterschiedliche Ganzzahlen. Daher wirkt sich die zweite Anweisung nicht auf t1.x aus.
Veränderliche Strukturen und veränderliche Klassen haben ein grundsätzlich unterschiedliches Verhalten, obwohl .net einige Macken in der Behandlung von Strukturmutationen hat. Wenn man ein wertartiges Verhalten wünscht (was bedeutet, dass "t2=t1" die Daten von t1 nach t2 kopiert, während t1 und t2 als unterschiedliche Instanzen bestehen bleiben) und wenn man mit den Macken von .net bei der Behandlung von Werttypen leben kann, sollte man eine Struktur verwenden. Wenn man Werttyp-Semantik will, aber die Macken von .net würden dazu führen, dass die Werttyp-Semantik in der eigenen Anwendung nicht funktioniert, sollte man eine Klasse verwenden und mumble.