Udostępnij przez


Wybieranie między klasą a strukturą

Uwaga / Notatka

Ta treść jest przedrukowana za zgodą Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2. wydanie. Wydanie to zostało opublikowane w 2008 roku, a książka została w pełni zmieniona w trzecim wydaniu. Niektóre informacje na tej stronie mogą być nieaktualne.

Jedną z podstawowych decyzji projektowych każdego projektanta platformy jest to, czy projektować typ jako klasę (typ odwołania) lub jako strukturę (typ wartości). Dobre zrozumienie różnic w zachowaniu typów odwołań i typów wartości ma kluczowe znaczenie w podejmowaniu tego wyboru.

pl-PL: Pierwszą różnicą między typami referencyjnymi a typami wartości, którą należy wziąć pod uwagę, jest to, że typy referencyjne są przydzielane na stercie i zarządzane przez mechanizm zbierania śmieci, podczas gdy typy wartości są przydzielane na stosie lub wbudowane w typy zawierające, a ich przydział jest zwalniany, gdy stos się zwija lub gdy ich typ zawierający jest zwalniany. W związku z tym alokacje i przydziały typów wartości są ogólnie tańsze niż alokacje i przydziały typów referencyjnych.

Następnie tablice typów referencyjnych są alokowane poza główną linią, co oznacza, że elementy tablicy to odwołania do instancji typu referencyjnego znajdującego się na stercie. Tablice typów wartości są przydzielane w linii, co oznacza, że elementy tablicy są rzeczywistymi wystąpieniami typu wartości. W związku z tym alokacje i przydziały tablic typów wartości są znacznie tańsze niż alokacje i przydziały tablic typów odwołań. Ponadto w większości przypadków tablice typu wartości wykazują znacznie lepszą lokalność odwołań.

Następna różnica jest związana z użyciem pamięci. Typy wartości są pakowane podczas rzutowania do typu referencyjnego lub implementowanego interfejsu. Są one konwertowane z powrotem do typu wartości, gdy zostaną ponownie przypisane. Ze względu na to, że obiekty pudełek są przydzielane na stercie i zbierane przez mechanizm odśmiecania pamięci, zbyt wiele dokonywania boxingu i unboxingu może mieć negatywny wpływ na stertę, moduł odśmiecania pamięci i ostatecznie wydajność aplikacji. Z kolei nie ma takiego boksu, ponieważ typy odwołań są rzutowane. (Aby uzyskać więcej informacji, zobacz Boxing and Unboxing ).

Następnie przypisania typów odwołań kopiują odwołanie, podczas gdy przypisania typu wartości kopiują całą wartość. W związku z tym przypisania dużych typów odwołań są tańsze niż przypisania dużych typów wartości.

Na koniec typy referencyjne przekazywane są poprzez odniesienie, a typy wartości przez wartość. Zmiany w wystąpieniu typu odwołania mają wpływ na wszystkie odwołania wskazujące wystąpienie. Wystąpienia typu wartościowego są kopiowane podczas ich przekazywania przez wartość. Kiedy instancja typu wartości zostanie zmieniona, nie wpływa oczywiście na żadną z jej kopii. Ponieważ kopie nie są tworzone jawnie przez użytkownika, ale są niejawnie tworzone, gdy argumenty są przekazywane lub zwracane wartości, typy wartości, które można zmienić, mogą być mylące dla wielu użytkowników. W związku z tym typy wartości powinny być niezmienne.

Zgodnie z zasadą, większość typów w modelu powinna być klasami. Istnieją jednak pewne sytuacje, w których cechy typu wartości sprawiają, że bardziej odpowiednie jest użycie struktur.

✔️ ROZWAŻ zdefiniowanie struktury zamiast klasy, jeśli wystąpienia typu są małe i często krótkotrwałe lub są często osadzone w innych obiektach.

❌ UNIKAJ definiowania struktury, chyba że typ ma wszystkie następujące cechy:

  • Logicznie reprezentuje jedną wartość, podobną do typów pierwotnych (intdouble, itp.).

  • Ma rozmiar instancji poniżej 16 bajtów.

  • Jest niezmienny.

  • Nie będzie musiał być często boksowany.

We wszystkich innych przypadkach należy zdefiniować typy jako klasy.

© Części 2005, 2009 Microsoft Corporation. Wszelkie prawa zastrzeżone.

Przedrukowane za zgodą Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition przez Krzysztofa Cwalinę i Brada Abramsa, opublikowane 22 października 2008 przez Addison-Wesley Professional w ramach serii Microsoft Windows Development.

Zobacz także