In Visual Basic worden structuren gedefinieerd met het trefwoord Structure. Ze:
MustInherit (abstract) worden gedeclareerd of finalizers bevatten;Public Structure Point Public X As Integer Public Y As Integer Public Sub New(x As Integer, y As Integer) Me.X = x Me.Y = y End Sub End Structure Dim p1 As New Point(1, 2) Dim p2 = p1 ' Waarde wordt gekopieerd, geen referentie! p2.X = 5 ' p1.X = 1, p2.X = 5
V: Hoe gedraagt een structuur zich bij het doorgeven aan een functie ByVal en ByRef? Wat is het verschil met het doorgeven van een klasse?
A: Bij het doorgeven van een structuur ByVal wordt een kopie van de gehele structuur gemaakt. Wijzigingen in de functie raken het origineel niet. Bij ByRef — wordt de oorspronkelijke variabele gewijzigd. In tegenstelling tot klassen, die bij elke overdracht (zelfs ByVal) een referentie doorgeven, worden structuren bij ByVal volledig gekopieerd, wat van invloed is op de prestaties en het gedrag.
Sub MutateByVal(p As Point) p.X = 100 End Sub Sub MutateByRef(ByRef p As Point) p.X = 100 End Sub Dim s As New Point(3, 4) MutateByVal(s) ' s.X is nog steeds 3 MutateByRef(s) ' s.X is nu 100
Geschiedenis
1. In een groot bibliotheekproject werden structuren gebruikt voor het doorgeven van grote datamatrizen via interfaces ByVal. Dit leidde tot prestatieproblemen door meervoudig kopiëren van grote structuren op de stack. Het probleem werd opgelost door structuren te vervangen door onveranderlijke klassen.
Geschiedenis
2. In een GIS-ontwikkelingsproject ontstond verwarring bij het kopiëren van structuren die referentievelden bevatten — door een array binnen de structuur te wijzigen, verwachtte de ontwikkelaar niet dat het origineel overal veranderd werd waar de array was gekopieerd, ondanks het 'value type'.
Geschiedenis
3. In boekhoudsoftware werden structuren gemengd met klassen voor bedrijfsentiteiten: de poging om overerving voor een structuur te implementeren resulteerde in een compilatiefout, waardoor de architectuur van het systeem herschikt moest worden, wat arbeidsintensief bleek door de aanvankelijke verkeerde keuze tussen structuren en klassen.