Megosztás a következőn keresztül:


Választás az osztály és a struktúra között

Feljegyzés

Ezt a tartalmat a Pearson Education, Inc. engedélyével nyomtatjuk újra a Framework Design Guidelines: Conventions, Idioms és Patterns for Reusable .NET Libraries, 2nd Edition engedélyével. Ezt a kiadást 2008-ban adták ki, és a könyvet azóta teljesen átdolgozták a harmadik kiadásban. Előfordulhat, hogy az oldalon található információk némelyike elavult.

A keretrendszertervezők egyik alapvető tervezési döntése, hogy osztályként (referenciatípusként) vagy szerkezetként (értéktípusként) terveznek-e típust. A referenciatípusok és az értéktípusok viselkedésének különbségeinek megértése elengedhetetlen a választáshoz.

A referenciatípusok és az értéktípusok közötti első különbség az, hogy a referenciatípusok a halomra és a szemétgyűjtésre vannak lefoglalva, míg az értéktípusok vagy a veremen vagy a beágyazott típusok között vannak lefoglalva, és felszabadítva a verem visszatekerésekor vagy a tárolótípus felszabadításakor. Ezért az értéktípusok kiosztása és felszabadítása általában olcsóbb, mint a referenciatípusok kiosztása és felszabadítása.

Ezután a hivatkozástípusok tömbjei soron kívül vannak lefoglalva, ami azt jelenti, hogy a tömbelemek csak a halomon található referenciatípus példányaira hivatkoznak. Az érték típusú tömbök beágyazottan vannak lefoglalva, ami azt jelenti, hogy a tömbelemek az értéktípus tényleges példányai. Ezért az érték típusú tömbök lefoglalásai és felszabadításai sokkal olcsóbbak, mint a referencia típusú tömbök lefoglalásai és felszabadításai. Emellett az esetek többségében az érték típusú tömbök sokkal jobb hivatkozási helyeket mutatnak.

A következő különbség a memóriahasználattal kapcsolatos. Az értéktípusok akkor lesznek bekeretezve, ha referenciatípusra vagy az általuk implementált felületek egyikére kerülnek. Az értéktípusra való visszadobáskor a beérkezett üzenetek nem lesznek bejelölve. Mivel a dobozok olyan objektumok, amelyek a halomra vannak lefoglalva, és szemetet gyűjtenek, a túl sok dobozolás és a dobozolás negatív hatással lehet a halomra, a szemétgyűjtőre és végső soron az alkalmazás teljesítményére. Ezzel szemben nem történik ilyen boxolás, mivel a referenciatípusok öntöttek. (További információ: Boxing and Unboxing).

Ezután a referenciatípus-hozzárendelések a hivatkozást másolják, míg az értéktípus-hozzárendelések a teljes értéket másolják. Ezért a nagy referenciatípusok hozzárendelése olcsóbb, mint a nagy értéktípusok hozzárendelése.

Végül a referenciatípusok hivatkozással vannak átadva, míg az értéktípusok érték szerint vannak átadva. A hivatkozástípus egy példányának módosítása hatással van a példányra mutató összes hivatkozásra. Az értéktípus-példányok másolása akkor történik meg, amikor azokat érték alapján továbbítja a rendszer. Ha egy értéktípus egy példányát módosítják, az természetesen nem befolyásolja egyik példányát sem. Mivel a másolatokat nem a felhasználó hozza létre explicit módon, hanem implicit módon jönnek létre az argumentumok átadásakor vagy visszaadott értékek visszaadásakor, a módosítható értéktípusok sok felhasználó számára zavaróak lehetnek. Ezért az értéktípusoknak nem módosíthatóknak kell lenniük.

Ökölszabályként a keretrendszer típusok többségének osztályoknak kell lennie. Vannak azonban olyan helyzetek, amikor egy értéktípus jellemzői megfelelőbbé teszik a szerkezetek használatát.

✔️ Érdemes lehet osztály helyett szerkezetet definiálni, ha a típuspéldányok kicsik és gyakran rövid élettartamúak, vagy gyakran más objektumokba vannak beágyazva.

❌ KERÜLJE a szerkezet definiálását, kivéve, ha a típus az alábbi jellemzők mindegyikével rendelkezik:

  • Logikailag egyetlen értéket jelöl, hasonlóan a primitív típusokhoz (intstb double.).

  • A példány mérete 16 bájt alatt van.

  • Nem módosítható.

  • Nem kell gyakran bekeretezettnek lennie.

Minden más esetben osztályként kell definiálnia a típusokat.

© Részletek 2005, 2009 Microsoft Corporation. Minden jog fenntartva.

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 22, 2008 by Addison-Wesley Professional, a Microsoft Windows Development Series részeként.

Lásd még