In Visual Basic ondersteunen verzamelingen (arrays, lijsten, dictionaries, enz.) toegang zowel via index als met behulp van iterators (bijvoorbeeld via For Each). In de geschiedenis van de taal had het eerste element van de standaardarray index 0, maar vanwege de compatibiliteit met VB6 komen er arrays voor die vanaf 1 zijn gedeclareerd. Dit beïnvloedt de volgorde van toegang en mogelijke fouten. Ook ondersteunen verzamelingen van het type Dictionary zoeken op sleutel, maar het proberen te benaderen van een niet-bestaand element kan leiden tot het werpen van een uitzondering.
Het probleem van toegang ligt in de verschillen in syntaxis, de werking van indexers en het feit dat niet alle verzamelingen Null of Nothing teruggeven bij afwezigheid van een element; vaak gebeurt er een uitzondering. Bij het gebruik van lussen is het belangrijk om het indexbereik te respecteren en vooraf de grootte van de verzameling te controleren.
Een oplossing voor veilige toegang omvat het controleren van de lengte, werken met de methoden ContainsKey of TryGetValue voor dictionaries, evenals het opsommen van elementen met behulp van For Each, waarbij de toegang gebeurt tot bestaande waarden zonder risico op overschrijding.
Voorbeeldcode:
Dim list As New List(Of String)({"a", "b", "c"}) For i As Integer = 0 To list.Count - 1 Console.WriteLine(list(i)) Next ' Iteratie via iterator: For Each item In list Console.WriteLine(item) Next ' Veilige toegang in Dictionary Dim dict As New Dictionary(Of Integer, String) dict(1) = "one" If dict.ContainsKey(2) Then Console.WriteLine(dict(2)) End If
Belangrijke kenmerken:
Kan ik Dictionary benaderen via index, zoals bij een array?
Nee, Dictionary ondersteunt geen toegang via een numerieke index, alleen via de sleutel. Om sleutels in volgorde te doorlopen, moet je de sleutelverzameling krijgen:
For Each key In dict.Keys Console.WriteLine(dict(key)) Next
Wat gebeurt er als ik List probeer te benaderen met een index buiten het bereik?
Er wordt een uitzondering ArgumentOutOfRangeException geworpen. Controleer altijd of de index kleiner is dan Count en groter of gelijk aan 0.
Kan For Each elementen overslaan als de verzameling tijdens iteratie verandert?
Ja, het wijzigen van de verzameling binnen For Each leidt tot een uitzondering InvalidOperationException. Vermijd het toevoegen of verwijderen van elementen tijdens de iteratie:
' Voorbeeld van een fout For Each x In list list.Remove(x) ' Werpt een uitzondering Next
Nieuwkomers voegden elementen toe aan de List binnen een For Each-lus, waardoor de applicatie vastliep met de fout InvalidOperationException.
Voordelen:
Sla de lijst van elementen op in een aparte array voor je begint met itereren, werk met een kopie, of gebruik For met index. Toegang tot Dictionary alleen na controle op sleutel.
Voordelen: