История вопроса
Цикл For...Next существует в Visual Basic с первых версий, позволяя перебрать диапазон значений, часто используется для работы с массивами и коллекциями. В VB.NET был добавлен семантически более строгий счетчик и поддержка шага (Step).
Проблема
Классическая ошибка — изменение значения счетчика цикла (например, i), что приводит к ошибочному поведению: счетчик всё равно автоматически инкрементируется/декрементируется в конце каждой итерации. Также важно правильно задавать границы перебора коллекций (например, For i = 0 To arr.Length - 1).
Решение
Всегда используйте неизменяемые счетчики или сразу помещайте в переменную выражение для верхней границы, если коллекция может изменяться внутри цикла. Не изменяйте явно переменную-счетчик в теле цикла.
Пример кода:
Dim arr() As Integer = {1, 2, 3, 4} For i As Integer = 0 To arr.Length - 1 Console.WriteLine(arr(i)) Next
Ключевые особенности:
Что произойдет, если вручную изменить счетчик в теле цикла?
Значение реально изменится только внутри текущей итерации, но в конце итерации Visual Basic автоматически выполнит инкремент/декремент, что приведет к непредсказуемому числу проходов.
For i = 1 To 5 If i = 3 Then i = 1 Console.WriteLine(i) Next
Можно ли использовать For...Next для перебора коллекций, типа List(Of T)?
Да, но предпочтительно использовать For Each для коллекций, чтобы избежать ошибок с изменяемым размером. For...Next хранит только индексы.
Что произойдет, если верхняя граница меньше нижней при положительном шаге?
Цикл не выполнится ни разу.
For i = 5 To 1 ' без Step - цикл не выполнится ... Next
Счетчик изменялся вручную при обнаружении определенного элемента, попытка пропустить будущие элементы привела к пропуску некоторых итераций и бесконечному циклу.
Плюсы:
Минусы:
Использование отдельной переменной для контроля условий, отсутствие вмешательства в счетчик цикла.
Плюсы:
Минусы: