W Visual Basic istnieją pętle For i For Each, z których każda jest stosowana do konkretnych zadań.
VB6 i klasyczny Visual Basic wspierały tylko pętle w oparciu o zakres (For ... Next). W późniejszych wersjach (począwszy od VB6 i VB.NET) pojawiła się pętla For Each, umożliwiająca eleganckie przechodzenie przez elementy kolekcji i tablic.
Głównym problemem jest niewłaściwy wybór typu pętli oraz próba modyfikacji kolekcji wewnątrz For Each, co prowadzi do błędów wykonania.
Użyj zwykłej pętli For, gdy:
Zastosuj For Each, gdy:
Przykład kodu:
' Przechodzenie przez elementy z modyfikacją Dim arr() As Integer = {1, 2, 3} For i As Integer = 0 To arr.Length - 1 arr(i) = arr(i) * 2 Next ' Tylko odczyt kolekcji Dim list As New List(Of String) From {"jeden", "dwa", "trzy"} For Each s As String In list Console.WriteLine(s) Next
Kluczowe cechy:
Czy można zmieniać kolekcję List(Of T) wewnątrz For Each?
Nie można. To spowoduje InvalidOperationException, ponieważ struktura kolekcji nie powinna być zmieniana podczas iteracji.
Jak prawidłowo wyjść z For Each przed czasem?
Użyj operatora Exit For, gdy znajdziesz odpowiedni element.
For Each s In list If s = "dwa" Then Exit For End If Next
Jaka jest różnica w prędkości między For a For Each dla tablic?
Zwykle różnica jest minimalna, ale For może być nieco szybszy (szczególnie dla tablic typów prostych), ponieważ działa bezpośrednio na indeksach, a For Each tworzy dodatkowy obiekt enumeratora.
**Negatywny przypadek
Programista próbuje usuwać elementy z List(Of T) wewnątrz For Each. Otrzymuje błąd InvalidOperationException podczas wykonania.
Zalety:
Wady:
**Pozytywny przypadek
Aby usunąć elementy, dokonuje się iteracji od końca za pomocą zwykłej pętli For:
For i = list.Count - 1 To 0 Step -1 If list(i) = "dwa" Then list.RemoveAt(i) End If Next
Zalety:
Wady: