ProgrammatieVB.NET ontwikkelaar

Hoe worden For- en For Each-lussen geïmplementeerd in Visual Basic, in welke gevallen moet je welke lus kiezen, en welke fouten komen vaak voor bij het werken met collecties?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

In Visual Basic zijn er For- en For Each-lussen, ieder geschikt voor specifieke taken.

Achtergrond van de vraag

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.

Probleem

Het belangrijkste probleem is het verkeerde type lus kiezen en proberen de collectie binnen For Each te wijzigen, wat tot runtime-fouten leidt.

Oplossing

Gebruik een gewone For-lus wanneer:

  • je de index van een element nodig hebt
  • je elementen van een array op index moet wijzigen
  • je door een bereik van getallen moet itereren

Gebruik For Each wanneer:

  • alleen de waarde van elk element belangrijk is
  • de structuur van de collectie vooraf niet bekend is
  • elegantie en minimalisering van fouten vereist zijn

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:

  • For wordt gebruikt voor het werken met indexes
  • Het is niet mogelijk om de collectie zelf binnen de For Each-lus te wijzigen
  • For Each is universeel voor elk IEnumerable-object

Vragen met een valstrik.

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.

Typische fouten en anti-patronen

  • Een collectie wijzigen tijdens For Each
  • Indexen verwarren bij het gebruik van een gewone For-lus met arrays en collecties
  • For Each gebruiken als de index van een element nodig is

Voorbeeld uit het leven

** Negatieve case

De ontwikkelaar probeert elementen uit een List(Of T) te verwijderen binnen For Each. Ontvangt een foutmelding InvalidOperationException tijdens runtime.

Voordelen:

  • Eenvoudige code voor het lezen van de collectie

Nadelen:

  • De toepassing crashed

** 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:

  • Geen iteratiefouten, alle benodigde elementen worden verwijderd

Nadelen:

  • Vereist meer code en begrip van datastructuren