Volba mezi třídou a strukturou

Poznámka:

Tento obsah je znovu vytištěn oprávněním Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms a Patterns for Reusable .NET Libraries, 2. vydání. Tato edice byla publikována v roce 2008 a kniha byla od té doby plně upravena ve třetím vydání. Některé informace na této stránce můžou být zastaralé.

Jedním ze základních rozhodnutí o návrhu každého návrháře architektury je to, jestli navrhnout typ jako třídu (odkazový typ) nebo jako strukturu (typ hodnoty). Při této volbě je důležité porozumět rozdílům v chování referenčních typů a hodnotových typů.

První rozdíl mezi odkazovými typy a typy hodnot, které budeme brát v úvahu, je, že odkazové typy jsou přiděleny na haldu a uvolňování paměti, zatímco typy hodnot jsou přiděleny buď v zásobníku, nebo vložené obsahující typy a uvolněny, když se zásobník uvolní nebo když se jejich typ obsahující uvolní. Přidělení a uvolnění typů hodnot jsou proto obecně levnější než přidělení a přidělení referenčních typů.

Dále jsou pole referenčních typů přidělena mimo řádek, což znamená, že prvky pole jsou pouze odkazy na instance typu odkazu, které se nacházejí v haldě. Pole typů hodnot jsou přidělena vloženě, což znamená, že prvky pole jsou skutečnými instancemi typu hodnoty. Přidělení a uvolnění polí typů hodnot jsou proto mnohem levnější než přidělení a přidělení polí referenčních typů. Kromě toho ve většině případů pole hodnotových typů vykazují mnohem lepší umístění odkazu.

Další rozdíl souvisí s využitím paměti. Typy hodnot se při přetypování do referenčního typu nebo jednoho z rozhraní, která implementují, zobrazí v rámečku. Při přetypování zpět na typ hodnoty se rozbalí. Protože pole jsou objekty, které jsou přiděleny na haldě a jsou uvolňování paměti, příliš mnoho boxování a rozbalení může mít negativní dopad na haldu, uvolňování paměti a nakonec výkon aplikace. Naproti tomu k žádnému takovému boxování nedojde, protože se přetypují odkazové typy. (Další informace najdete v tématu Boxing and Unboxing).

Dále přiřazení typu odkazu zkopírují odkaz, zatímco přiřazení typu hodnoty zkopírují celou hodnotu. Přiřazení velkých referenčních typů jsou proto levnější než přiřazení velkých hodnotových typů.

Nakonec se odkazové typy předávají odkazem, zatímco typy hodnot se předávají podle hodnoty. Změny instance typu odkazu ovlivňují všechny odkazy odkazující na instanci. Instance typu hodnoty se zkopírují při předávání podle hodnoty. Když je instance typu hodnoty změněna, samozřejmě nemá vliv na žádné jeho kopie. Vzhledem k tomu, že kopie nejsou explicitně vytvořeny uživatelem, ale jsou implicitně vytvořeny při předání nebo vrácení hodnot vrácených hodnot, typy hodnot, které lze změnit, mohou být matoucí pro mnoho uživatelů. Proto by měly být typy hodnot neměnné.

Obecně platí, že většina typů v rámci by měla být třídy. Existují však některé situace, kdy vlastnosti typu hodnoty umožňují vhodnější použít struktury.

✔️ ZVAŽTE definování struktury místo třídy, pokud jsou instance typu malé a běžně krátkodobé nebo jsou běžně vloženy do jiných objektů.

❌ Vyhněte se definování struktury, pokud typ nemá všechny následující vlastnosti:

  • Logicky představuje jednu hodnotu, podobnou primitivním typům (int, doubleatd.).

  • Má velikost instance pod 16 bajtů.

  • Je neměnný.

  • Nebude nutné ho často rámečekovat.

Ve všech ostatních případech byste měli definovat typy jako třídy.

© Části 2005, 2009 Microsoft Corporation. Všechna práva vyhrazena.

Reprinted by permission of Pearson Education, Inc. from Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, published Oct 22, 2008 by Addison-Wesley Professional v rámci Microsoft Windows Development Series.

Viz také