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 müssen für Klassenreferenzen 4/8 Byte gespeichert werden, unabhängig von der Informationsmenge in der Klasse. Das Kopieren einer Klassenreferenz erfordert das Kopieren von 4/8 Bytes. Auf der anderen Seite jeder andersDie Klasseninstanz hat zusätzlich zu den darin enthaltenen Informationen und den Speicherkosten der Verweise darauf 8/16 Byte Overhead. 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. Wenn die Entität ein Klassentyp ist, benötigt das Array mit 500 Referenzen 4.000 Byte. Wenn diese Verweise alle auf unterschiedliche Objekte verweisen, benötigen die Objekte jeweils zusätzliche 24 Byte (12.000 Byte für alle 500), insgesamt 16.000 Byte - das Doppelte der Speicherkosten eines Strukturtyps. Wenn der Code hingegen eine Objektinstanz erstellt und dann einen Verweis auf alle 500 Array-Slots kopiert, betragen die Gesamtkosten für diese Instanz 24 Byte und 4, 000 für das Array - insgesamt 4.024 Bytes. Eine große Einsparung. Nur wenige Situationen würden so gut funktionieren wie die letzte, aber in einigen Fällen kann es möglich sein, einige Verweise auf genügend Array-Slots zu kopieren, damit sich eine solche Freigabe 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. Angenommen, "Thing" ist entweder eine Struktur oder eine Klasse mit einem ganzzahligen Feld namens x, und man führt den folgenden Code aus:
Sache t1, t2;
...
t2 = t1;
t2.x = 5;
Möchte man, dass die letztere Aussage t1.x beeinflusst?
Wenn Thing ein Klassentyp ist, sind t1 und t2 äquivalent, was bedeutet, dass t1.x und t2.x ebenfalls äquivalent sind. Somit wirkt sich die zweite Anweisung auf t1.x aus. Wenn Thing ein Strukturtyp ist, sind t1 und t2 unterschiedliche Instanzen, was bedeutet, dass sich t1.x und t2.x auf unterschiedliche Ganzzahlen beziehen. Somit wirkt sich die zweite Anweisung nicht auf t1.x aus.
Veränderbare Strukturen und veränderbare Klassen verhalten sich grundlegend unterschiedlich, obwohl .net einige Besonderheiten im Umgang mit Strukturmutationen aufweist. Wenn Sie ein Verhalten vom Werttyp wünschen (was bedeutet, dass "t2 = t1" die Daten von t1 nach t2 kopiert, während t1 und t2 als unterschiedliche Instanzen belassen werden), und wenn Sie mit den Macken bei der Behandlung von Werttypen durch .net leben können, verwenden Sie eine Struktur. Wenn Sie eine Semantik vom Werttyp wünschen, die Macken von .net jedoch zu einer fehlerhaften Semantik vom Werttyp in Ihrer Anwendung führen würden, verwenden Sie eine Klasse und murmeln Sie.