ProgrammatieVB.NET ontwikkelaar, Backend ontwikkelaar

Hoe werken For Each-lussen in Visual Basic? Wat zijn de verschillen met For en While, welke objecten kunnen op deze manier worden doorlopen en welke valkuilen ontstaan bij het aanpassen van de collectie in de lus?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

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:

  • Je kunt de elementen van de collectie niet rechtstreeks wijzigen (vooral als de collectie onveranderlijk of structureel is).
  • De collectie moet de IEnumerable-interface implementeren.
  • Het wijzigen van de collectie (toevoegen/verwijderen van elementen) tijdens de lus kan leiden tot een InvalidOperationException.

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

Vraag met een valkuil

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

Voorbeelden van echte fouten door onbekendheid met de details van het onderwerp


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.