Share via


Kiezen tussen klasse en struct

Notitie

Deze inhoud wordt opnieuw afgedrukt door toestemming van Pearson Education, Inc. van Framework Design Guidelines: Conventions, Idioms en Patterns for Reusable .NET Libraries, 2nd Edition. Die editie werd in 2008 gepubliceerd en het boek is sindsdien volledig herzien in de derde editie. Sommige informatie op deze pagina is mogelijk verouderd.

Een van de basisontwerpbeslissingen voor elke ontwerpfunctie voor frameworks is of een type moet worden ontworpen als een klasse (een verwijzingstype) of als een struct (een waardetype). Goed begrip van de verschillen in het gedrag van referentietypen en waardetypen is van cruciaal belang bij het maken van deze keuze.

Het eerste verschil tussen referentietypen en waardetypen die we overwegen, is dat verwijzingstypen worden toegewezen aan de heap en garbagecollection, terwijl waardetypen worden toegewezen aan de stack of inline met typen en de toewijzing ervan ongedaan wordt gemaakt wanneer de stack wordt afgebroken of wanneer het bijbehorende type wordt opgeheven. Daarom zijn toewijzingen en deallocaties van waardetypen in het algemeen goedkoper dan toewijzingen en toewijzingen van referentietypen.

Vervolgens worden matrices van referentietypen out-of-line toegewezen, wat betekent dat de matrixelementen alleen verwijzingen zijn naar exemplaren van het referentietype die zich op de heap bevinden. Waardetypematrices worden inline toegewezen, wat betekent dat de matrixelementen de werkelijke exemplaren van het waardetype zijn. Daarom zijn toewijzingen en deallocaties van waardetypematrices veel goedkoper dan toewijzingen en deallocaties van referentietypematrices. In het merendeel van de gevallen vertonen waardetypematrices bovendien veel betere referentielocatie.

Het volgende verschil is gerelateerd aan geheugengebruik. Waardetypen worden in het vak geplaatst wanneer ze worden gecast naar een verwijzingstype of een van de interfaces die ze implementeren. Ze worden uitgepakt wanneer ze worden teruggezet naar het waardetype. Omdat dozen objecten zijn die zijn toegewezen aan de heap en afval worden verzameld, kan te veel boksen en uitpakken een negatieve invloed hebben op de heap, de garbagecollection en uiteindelijk de prestaties van de toepassing. Een dergelijke boksing komt daarentegen niet voor als referentietypen worden gegoten. (Zie voor meer informatie Boksen en Uitpakken).

Vervolgens kopieert verwijzingstypetoewijzingen de verwijzing, terwijl waardetypetoewijzingen de hele waarde kopiëren. Daarom zijn toewijzingen van grote referentietypen goedkoper dan toewijzingen van grote waardetypen.

Ten slotte worden verwijzingstypen doorgegeven door verwijzing, terwijl waardetypen worden doorgegeven door waarde. Wijzigingen in een exemplaar van een verwijzingstype zijn van invloed op alle verwijzingen die naar het exemplaar verwijzen. Exemplaren van het waardetype worden gekopieerd wanneer ze worden doorgegeven door een waarde. Wanneer een exemplaar van een waardetype wordt gewijzigd, heeft dit natuurlijk geen invloed op een van de kopieën. Omdat de kopieën niet expliciet door de gebruiker worden gemaakt, maar impliciet worden gemaakt wanneer argumenten worden doorgegeven of geretourneerde waarden worden geretourneerd, kunnen waardetypen die kunnen worden gewijzigd verwarrend zijn voor veel gebruikers. Daarom moeten waardetypen onveranderbaar zijn.

Als vuistregel moet het merendeel van de typen in een framework klassen zijn. Er zijn echter enkele situaties waarin de kenmerken van een waardetype het geschikter maken voor het gebruik van structs.

✔️ OVERWEEG een struct te definiëren in plaats van een klasse als exemplaren van het type klein zijn en vaak kort leven of vaak zijn ingesloten in andere objecten.

❌ VERMIJD het definiëren van een struct, tenzij het type alle volgende kenmerken heeft:

  • Het vertegenwoordigt logisch één waarde, vergelijkbaar met primitieve typen (int, doubleenzovoort).

  • Het heeft een instantiegrootte van minder dan 16 bytes.

  • Het is onveranderbaar.

  • Het zal niet vaak in het vak moeten worden geplaatst.

In alle andere gevallen moet u uw typen definiëren als klassen.

© Delen 2005, 2009 Microsoft Corporation. Alle rechten voorbehouden.

Herdrukt door toestemming van Pearson Education, Inc. van 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 als onderdeel van de Microsoft Windows Development Series.

Zie ook