De For Each-lus in Visual Basic is bedoeld voor het sequentieel doorlopen van alle elementen van een collectie of array. Het gebruik ervan vereenvoudigt het werken met enumerable objecten (Collection, Array, lijsten, enz.), zonder expliciete toegang tot indexen.
Syntax:
For Each element As DataType In collection ' Acties met element Next
Verschillen met andere lussen:
For — vereist het opgeven van een teller en een bereik, effectief wanneer toegang tot elementen op indexbasis nodig is.While — wordt uitgevoerd zolang de voorwaarde waar is, nuttig voor onvoorspelbare aantallen iteraties.For Each — iterereert over alle elementen zonder toegang tot indexen, geschikt voor moderne collecties.Beperkingen en eigenschappen van For Each:
Voorbeeld:
Dim items As New List(Of Integer)({1, 2, 3}) For Each item As Integer In items Console.WriteLine(item) Next
Proberen om de collectie binnen de lus te wijzigen kan een fout veroorzaken:
For Each item As Integer In items If item = 2 Then items.Remove(item) ' Uitzondering! End If Next
Kan je elementen van de collectie per waarde wijzigen met For Each, als de elementen structuren zijn?
Nee, als de elementen van de collectie structuren (value types) zijn, bevat de iteratorvariabele in For Each een kopie van de waarde. Elke wijziging aan de variabele beïnvloedt het werkelijke element van de collectie niet. Bijvoorbeeld:
Structure Point Public X As Integer End Structure Dim points As New List(Of Point)({New Point With {.X = 1}}) For Each pt In points pt.X = 100 ' Wijzigt niet points(0).X Next
Verhaal
In het project werd For Each gebruikt om velden van structuren van medewerkers te wijzigen. De iteratie wijzigde de oorspronkelijke gegevens niet, omdat het iteratie-object een kopie was en niet het daadwerkelijke element van de collectie. Daardoor werkte de salarisverhogingen niet.
Verhaal
Tijdens het doorlopen van een lijst in For Each werden elementen binnen een voorwaarde verwijderd — als gevolg daarvan gooide de applicatie een InvalidOperationException en stopte er abrupt mee.
Verhaal
Het doorlopen van een collectie via For Each zonder rekening te houden met de wijzigbaarheid ervan leidde tot een oneindige lus, toen een externe gegevensbron tegelijkertijd deze collectie vulde met het lezen ervan, wat leidde tot logische fouten in de berekeningen.