ProgrammatieVB/VB.NET ontwikkelaar

Hoe implementeer je gebruikersgedefinieerde datatypes (User-Defined Types, UDT's) in Visual Basic, en in welke gevallen moet je ze gebruiken in plaats van klassen?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

In Visual Basic stellen gebruikersgedefinieerde datatypes (Type in VB6 of Structure in VB.NET) je in staat om je eigen samengestelde typen te definiëren, die verschillende variabelen van verschillende types kunnen bevatten. Dit is handig voor het verpakken van gerelateerde gegevens.

UDT's (VB6):

Type Person Name As String Age As Integer Height As Single End Type Dim employee As Person employee.Name = "Alexey" employee.Age = 32 employee.Height = 1.85

Structuren (VB.NET):

Structure Person Public Name As String Public Age As Integer Public Height As Single End Structure Dim employee As Person employee.Name = "Alexey"

Wanneer te gebruiken:

  • Voor lichte datacontainers zonder logica
  • Wanneer prestaties belangrijk zijn (structuren worden in de stack gemaakt)
  • Als er geen geërfde functionaliteit nodig is — structuren ondersteunen geen overerving

In tegenstelling tot: Klassen worden gebruikt als encapsulatie van logica, overerving, polymorfisme of implementatie van interfaces nodig zijn.

Vraag met een valstrik

Waarom kunnen structuren in VB.NET geen waarden Nothing toegewezen krijgen?

Antwoord: Alleen klassevariabelen (objecten) kunnen Nothing toegewezen krijgen, omdat ze referenties opslaan. Structuren zijn value-type, ze bevatten altijd een set waarden; proberen Nothing toe te wijzen leidt tot een compilatiefout.

Dim s As Person = Nothing 'Fout! Structuren kunnen niet Nothing zijn (behalve Nullable(Of T))

Voorbeelden van echte fouten door gebrek aan kennis van de nuances van het onderwerp


Verhaal

In een oud project werd besloten om een array van primitieve types te vervangen door een structuur met meerdere velden, maar de nieuwe code werd onverwachts langzamer. Het bleek dat de structuur erg groot was en vaak naar functies werd gekopieerd. Als een klasse was gebruikt, zouden alleen de referenties zijn gekopieerd, en niet de structuur zelf.


Verhaal

Na het porteren van een VB6-UDT naar VB.NET implementeerde een van de ontwikkelaars het ISerializable-interface niet voor de structuur in een remote call. Hierdoor kon het verwijderde object niet worden geserialiseerd, wat leidde tot fouten bij interprocesscommunicatie.


Verhaal

In een module voor geometriewerkzaamheden bewaarde de structuur referenties naar arrays (mutable). Meerdere instanties van deze structuur leidden tot onverwachte effecten, omdat binnen de structuur de referenties naar dezelfde arrays verwezen — mutaties weerspiegelden zich in alle kopieën!