Jeśli jednostka będzie niezmienna, pytanie, czy użyć struktury czy klasy, będzie na ogół dotyczyło wydajności, a nie semantyki. W systemie 32/64-bitowym odwołania do klas wymagają przechowywania 4/8 bajtów, niezależnie od ilości informacji w klasie; skopiowanie odwołania do klasy będzie wymagało skopiowania 4/8 bajtów. Z drugiej strony każdy wyraźnyinstancja klasy będzie miała 8/16 bajtów narzutu oprócz informacji, które posiada i kosztu pamięci odniesień do niej. Załóżmy, że ktoś chce tablicy 500 jednostek, z których każda zawiera cztery 32-bitowe liczby całkowite. Jeśli jednostka jest typem struktury, tablica będzie wymagać 8 000 bajtów niezależnie od tego, czy wszystkie 500 jednostek jest identycznych, różnych lub pomiędzy nimi. Jeśli jednostka jest typem klasy, tablica 500 referencji zajmie 4000 bajtów. Gdyby wszystkie te odniesienia wskazywały na różne obiekty, obiekty wymagałyby dodatkowych 24 bajtów każdy (12 000 bajtów na wszystkie 500), łącznie 16 000 bajtów - dwa razy więcej niż koszt przechowywania typu strukturalnego. Z drugiej strony kod utworzył jedną instancję obiektu, a następnie skopiował odwołanie do wszystkich 500 gniazd tablic, całkowity koszt wyniósłby 24 bajty dla tej instancji i 4, 000 dla tablicy - łącznie 4024 bajtów. Duże oszczędności. Działałoby niewiele sytuacji, tak jak i ostatnia, ale w niektórych przypadkach może być możliwe skopiowanie niektórych odniesień do wystarczającej liczby gniazd tablic, aby takie współdzielenie było opłacalne.
Jeśli jednostka ma być zmienna, pytanie, czy użyć klasy czy struktury, jest pod pewnymi względami łatwiejsze. Załóżmy, że „Rzecz” jest strukturą lub klasą, która ma pole liczby całkowitej o nazwie x i wykonuje następujący kod:
Rzecz t1, t2;
...
t2 = t1;
t2.x = 5;
Czy ktoś chce, aby ta ostatnia instrukcja wpływała na t1.x?
Jeśli Thing jest typem klasy, t1 i t2 będą równoważne, co oznacza, że t1.x i t2.x również będą równoważne. Zatem druga instrukcja wpłynie na t1.x. Jeśli Thing jest typem struktury, t1 i t2 będą różnymi instancjami, co oznacza, że t1.x i t2.x będą odnosić się do różnych liczb całkowitych. Zatem drugie zdanie nie wpłynie na t1.x.
Zmienne struktury i zmienne klasy mają zasadniczo różne zachowania, chociaż .net ma pewne dziwactwa w obsłudze mutacji struktur. Jeśli ktoś chce zachowania typu wartości (co oznacza, że „t2 = t1” skopiuje dane z t1 do t2, pozostawiając t1 i t2 jako odrębne instancje) i jeśli można żyć z dziwactwami w obsłudze typów wartości w .net, użyj struktura. Jeśli ktoś chce semantyki typu wartości, ale dziwactwa .net spowodowałyby popsutą semantykę typu wartości w swojej aplikacji, należy użyć klasy i mamrotać.