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:
In tegenstelling tot: Klassen worden gebruikt als encapsulatie van logica, overerving, polymorfisme of implementatie van interfaces nodig zijn.
Waarom kunnen structuren in VB.NET geen waarden
Nothingtoegewezen 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))
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!