ProgrammatieVB.NET ontwikkelaar, architect

Beschrijf de kenmerken en het correcte gebruik van structuren (Structure) in Visual Basic in vergelijking met klassen (Class). Welke beperkingen zijn er bij hun gebruik en hoe verschillen ze van klassen op het gebied van geheugenbeheer en gedrag?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

In Visual Basic worden structuren gedefinieerd met het trefwoord Structure. Ze:

  • Zijn waarde-types (value type): worden op de stack of binnen andere objecten geplaatst;
  • Ondersteunen geen overerving van andere gebruikersdefinities (maar kunnen interfaces implementeren);
  • Kunnen geen constructor zonder parameters hebben, behalve de standaardconstructor buiten de structuur;
  • Kunnen niet als MustInherit (abstract) worden gedeclareerd of finalizers bevatten;
  • Zijn een goede keuze voor kleine, onveranderlijke objecten die geheugen op de heap besparen.

Voorbeeld

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

Beperkingen

  • Structuren kunnen niet van elkaar erven, alleen van System.ValueType.
  • Alleen automatische constructor zonder parameters is toegestaan.
  • Alleen interfaces zijn toegestaan voor implementatie.
  • Als de structuur referentietypen bevat, is voorzichtigheid geboden vanwege mogelijke nuances bij het kopiëren en muteren.

Vraag met een valstrik

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.