Structuren en klassen (Visual Basic)
Visual Basic unifieert de syntaxis voor structuren en klassen, met het resultaat dat beide entiteiten de meeste van dezelfde functies ondersteunen. Er zijn echter ook belangrijke verschillen tussen structuren en klassen.
Klassen hebben het voordeel van verwijzingstypen: het doorgeven van een verwijzing is efficiënter dan het doorgeven van een structuurvariabele met alle bijbehorende gegevens. Aan de andere kant vereisen structuren geen toewijzing van geheugen op de globale heap.
Omdat u niet kunt overnemen van een structuur, moeten structuren alleen worden gebruikt voor objecten die niet hoeven te worden uitgebreid. Gebruik structuren wanneer het object dat u wilt maken een kleine instantiegrootte heeft en houd rekening met de prestatiekenmerken van klassen versus structuren.
Overeenkomsten
Structuren en klassen zijn vergelijkbaar in de volgende opzichten:
Beide zijn containertypen , wat betekent dat ze andere typen als leden bevatten.
Beide hebben leden, waaronder constructors, methoden, eigenschappen, velden, constanten, opsommingen, gebeurtenissen en gebeurtenis-handlers.
Leden van beide kunnen afzonderlijke toegangsniveaus hebben. Eén lid kan bijvoorbeeld worden gedeclareerd
Public
en een anderPrivate
lid.Beide kunnen interfaces implementeren.
Beide kunnen gedeelde constructors hebben, met of zonder parameters.
Beide kunnen een standaardeigenschap beschikbaar maken, mits deze eigenschap ten minste één parameter gebruikt.
Beide kunnen gebeurtenissen declareren en genereren, en beide kunnen gemachtigden declareren.
rapporteren
Structuren en klassen verschillen in de volgende gegevens:
Structuren zijn waardetypen; klassen zijn referentietypen. Een variabele van een structuurtype bevat de gegevens van de structuur in plaats van een verwijzing naar de gegevens als een klassetype.
Structuren maken gebruik van stacktoewijzing; klassen maken gebruik van heap-toewijzing.
Alle structuurelementen zijn
Public
standaard; klassevariabelen en constanten zijnPrivate
standaard, terwijl andere klasseleden standaard zijnPublic
. Dit gedrag voor klasseleden biedt compatibiliteit met het Visual Basic 6.0-systeem van standaardinstellingen.Een structuur moet ten minste één niet-gedeelde variabele of een niet-gedeeld gebeurteniselement hebben; een klasse kan volledig leeg zijn.
Structuurelementen kunnen niet worden gedeclareerd als
Protected
; klasseleden kunnen.Een structuurprocedure kan gebeurtenissen alleen verwerken als het een gedeelde
Sub
procedure is, en alleen met behulp van de Instructie AddHandler. Elke klasseprocedure kan gebeurtenissen afhandelen met behulp van het trefwoord Handles of deAddHandler
instructie. Zie Gebeurtenissen voor meer informatie.Declaraties van structuurvariabelen kunnen geen initialisatie- of initiële grootten voor matrices opgeven; declaraties van klassevariabelen kunnen.
Structuren nemen impliciet over van de System.ValueType klasse en kunnen niet worden overgenomen van een ander type; klassen kunnen overnemen van andere klassen of klassen dan System.ValueType.
Structuren kunnen niet worden overgenomen; klassen zijn.
Structuren worden nooit beëindigd, dus de common language runtime (CLR) roept nooit de Finalize methode aan op een structuur; klassen worden beëindigd door de garbagecollector (GC), die een klasse aanroept Finalize wanneer er geen actieve verwijzingen overblijven.
Een structuur vereist geen constructor; een klas wel.
Structuren kunnen alleen niet-gedeelde constructors hebben als ze parameters aannemen; klassen kunnen ze met of zonder parameters hebben.
Elke structuur heeft een impliciete openbare constructor zonder parameters. Met deze constructor worden alle gegevenselementen van de structuur geïnitialiseerd tot de standaardwaarden. U kunt dit gedrag niet opnieuw definiëren.
Exemplaren en variabelen
Omdat structuren waardetypen zijn, is elke structuurvariabele permanent gebonden aan een afzonderlijke structuurinstantie. Klassen zijn verwijzingstypen en een objectvariabele kan op verschillende tijdstippen verwijzen naar verschillende klasse-exemplaren. Dit onderscheid is van invloed op het gebruik van structuren en klassen op de volgende manieren:
Initialisatie. Een structuurvariabele bevat impliciet een initialisatie van de elementen met behulp van de parameterloze constructor van de structuur.
Dim s As struct1
Daarom is gelijk aanDim s As struct1 = New struct1()
.Variabelen toewijzen. Wanneer u een structuurvariabele aan een andere toewijst of een structuurinstantie doorgeeft aan een procedureargument, worden de huidige waarden van alle variabele elementen gekopieerd naar de nieuwe structuur. Wanneer u één objectvariabele aan een andere toewijst of een objectvariabele doorgeeft aan een procedure, wordt alleen de verwijzingsaanwijzer gekopieerd.
Niets toewijzen. U kunt de waarde Niets toewijzen aan een structuurvariabele, maar het exemplaar blijft gekoppeld aan de variabele. U kunt de methoden nog steeds aanroepen en toegang krijgen tot de bijbehorende gegevenselementen, hoewel variabele elementen opnieuw worden geïnitialiseerd door de toewijzing.
Als u daarentegen een objectvariabele
Nothing
instelt, ontkoppelt u deze van een klasse-exemplaar en hebt u geen toegang tot leden via de variabele totdat u er een ander exemplaar aan toewijst.Meerdere exemplaren. Aan een objectvariabele kunnen verschillende klasse-exemplaren op verschillende momenten worden toegewezen en verschillende objectvariabelen kunnen tegelijkertijd verwijzen naar hetzelfde klasse-exemplaar. Wijzigingen die u aanbrengt in de waarden van klasseleden zijn van invloed op die leden wanneer ze worden geopend via een andere variabele die verwijst naar hetzelfde exemplaar.
Structuurelementen worden echter geïsoleerd binnen hun eigen exemplaar. Wijzigingen in hun waarden worden niet doorgevoerd in andere structuurvariabelen, zelfs in andere exemplaren van dezelfde
Structure
declaratie.Gelijkheid. Gelijkheidstests van twee structuren moeten worden uitgevoerd met een element-by-elementtest. Er kunnen twee objectvariabelen worden vergeleken met behulp van de Equals methode. Equals geeft aan of de twee variabelen naar hetzelfde exemplaar verwijzen.