In Visual Basic zijn er For- en For Each-lussen, ieder geschikt voor specifieke taken.
VB6 en klassiek Visual Basic ondersteunden alleen lussen op basis van bereik (For ... Next). In latere versies (vanaf VB6 en VB.NET) is For Each geïntroduceerd, waarmee je elegant elementen van collecties en arrays kunt doorlopen.
Het belangrijkste probleem is het verkeerde type lus kiezen en proberen de collectie binnen For Each te wijzigen, wat tot runtime-fouten leidt.
Gebruik een gewone For-lus wanneer:
Gebruik For Each wanneer:
Voorbeeldcode:
' Elementen doorlopen met wijziging Dim arr() As Integer = {1, 2, 3} For i As Integer = 0 To arr.Length - 1 arr(i) = arr(i) * 2 Next ' Alleen lezen van de collectie Dim list As New List(Of String) From {"one", "two", "three"} For Each s As String In list Console.WriteLine(s) Next
Belangrijke kenmerken:
Kan een collectie List(Of T) worden gewijzigd binnen For Each?
Nee. Dit leidt tot InvalidOperationException, omdat de structuur van de collectie niet mag veranderen tijdens het itereren.
Hoe kan je vroegtijdig uit For Each komen?
Gebruik de Exit For-instructie wanneer het gewenste element is gevonden.
For Each s In list If s = "two" Then Exit For End If Next
Wat is het snelheidverschil tussen For en For Each voor arrays?
In het algemeen is het verschil minimaal, maar For kan iets sneller zijn (vooral voor arrays van primitieve types), omdat het rechtstreeks met indexes werkt, terwijl For Each een extra enumerator-object creëert.
** Negatieve case
De ontwikkelaar probeert elementen uit een List(Of T) te verwijderen binnen For Each. Ontvangt een foutmelding InvalidOperationException tijdens runtime.
Voordelen:
Nadelen:
** Positieve case
Voor het verwijderen van elementen wordt een omgekeerde iteratie uitgevoerd met een gewone For:
For i = list.Count - 1 To 0 Step -1 If list(i) = "two" Then list.RemoveAt(i) End If Next
Voordelen:
Nadelen: