Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Opmerking
Deze inhoud wordt opnieuw afgedrukt met toestemming van Pearson Education, Inc. uit Framework Design Guidelines: Conventies, idioom en patronen voor herbruikbare .NET-bibliotheken, 2e editie. 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 dat we zullen bekijken, is dat referentietypen aan de heap worden toegewezen en garbage-collected worden, terwijl waardetypen ofwel in de stack worden toegewezen of inline binnen de omvattende typen en worden vrijgegeven wanneer de stack afwikkelt of wanneer hun omvattende type wordt opgeheven. Daarom zijn toewijzingen en deallocaties van waardetypen in het algemeen goedkoper dan toewijzingen en deallocaties van referentietypen.
Vervolgens worden arrays van referentietypen toegewezen buiten de hoofdlijn, waarbij de array-elementen alleen verwijzingen zijn naar instanties 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 geboxed wanneer ze worden gecast naar een referentietype of een van de interfaces die ze implementeren. Ze worden uitgepakt wanneer ze worden omgezet naar het oorspronkelijke 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 Boksen en Uitpakken voor meer informatie.
Vervolgens kopiëren toewijzingen van verwijzingstypen de verwijzing, terwijl toewijzingen van waardetypen de gehele waarde kopiëren. Daarom zijn toewijzingen van grote referentietypen goedkoper dan toewijzingen van grote waardetypen.
Ten slotte worden verwijzingstypen als verwijzing doorgegeven, terwijl waardetypen als waarde worden doorgegeven. 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 instantie van een waardetype wordt gewijzigd, heeft dit natuurlijk geen invloed op zijn 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
,double
enzovoort).Het heeft een instantiegrootte van minder dan 16 bytes.
Het is onveranderbaar.
Het zal niet vaak hoeven worden ingepakt.
In alle andere gevallen moet u uw typen definiëren als klassen.
© Gedeelten 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, gepubliceerd 22 oktober 2008 door Addison-Wesley Professional als onderdeel van de Microsoft Windows Development Series.