Historia pytania
Pętla For...Next istnieje w Visual Basic od pierwszych wersji, pozwalając na przeglądanie zakresu wartości, często używana do pracy z tablicami i kolekcjami. W VB.NET dodano semantycznie bardziej rygorystyczny licznik oraz wsparcie dla kroku (Step).
Problem
Klasyczny błąd — zmiana wartości licznika pętli (np. i), co prowadzi do błędnego zachowania: licznik i tak automatycznie inkrementuje/dekrementuje się na końcu każdej iteracji. Ważne jest również poprawne ustawienie granic przeglądania kolekcji (np. For i = 0 To arr.Length - 1).
Rozwiązanie
Zawsze używaj niemodyfikowalnych liczników lub od razu przypisuj do zmiennej wyrażenie dla górnej granicy, jeśli kolekcja może się zmieniać w trakcie pętli. Nie zmieniaj bezpośrednio zmiennej-licznika w ciele pętli.
Przykład kodu:
Dim arr() As Integer = {1, 2, 3, 4} For i As Integer = 0 To arr.Length - 1 Console.WriteLine(arr(i)) Next
Kluczowe cechy:
Co się stanie, jeśli ręcznie zmienisz licznik w ciele pętli?
Wartość naprawdę zmieni się tylko w bieżącej iteracji, ale na końcu iteracji Visual Basic automatycznie wykona inkrementację/dekrementację, co doprowadzi do nieprzewidywalnej liczby przejść.
For i = 1 To 5 If i = 3 Then i = 1 Console.WriteLine(i) Next
Czy można używać For...Next do przeglądania kolekcji, typu List(Of T)?
Tak, ale preferowane jest używanie For Each dla kolekcji, aby uniknąć błędów związanych z zmieniającym się rozmiarem. For...Next przechowuje tylko indeksy.
Co się stanie, jeśli górna granica jest mniejsza od dolnej przy dodatnim kroku?
Pętla nie zostanie wykonana ani razu.
For i = 5 To 1 ' bez Step - pętla się nie wykona ... Next
Licznik zmieniał się ręcznie przy wykryciu określonego elementu, próba pominięcia przyszłych elementów prowadziła do pominięcia niektórych iteracji i nieskończonej pętli.
Zalety:
Wady:
Użycie oddzielnej zmiennej do kontrolowania warunków, brak ingerencji w licznik pętli.
Zalety:
Wady: