В Visual Basic существуют циклы For и For Each, каждый из которых применим для конкретных задач.
VB6 и классический Visual Basic поддерживали только циклы по диапазону (For ... Next). В поздних версиях (начиная с VB6 и VB.NET) появился For Each, позволяющий элегантно перебрать элементы коллекций и массивов.
Основная проблема — неправильный выбор типа цикла и попытки модифицировать коллекцию внутри For Each, что приводит к ошибкам выполнения.
Используйте обычный For, когда:
Применяйте For Each, когда:
Пример кода:
' Перебор элементов с изменением Dim arr() As Integer = {1, 2, 3} For i As Integer = 0 To arr.Length - 1 arr(i) = arr(i) * 2 Next ' Только чтение коллекции Dim list As New List(Of String) From {"one", "two", "three"} For Each s As String In list Console.WriteLine(s) Next
Ключевые особенности:
Можно ли изменять коллекцию List(Of T) внутри For Each?
Нельзя. Это приведёт к InvalidOperationException, потому что структура коллекции не должна меняться во время итерирования.
Как правильно выйти из For Each раньше времени?
Использовать оператор Exit For, когда найден нужный элемент.
For Each s In list If s = "two" Then Exit For End If Next
В чём разница по скорости между For и For Each для массивов?
Обычно разница минимальна, но For может быть чуть быстрее (особенно для массивов примитивных типов), так как работает напрямую с индексами, а For Each создаёт дополнительный объект-перечислитель.
** Негативный кейс
Разработчик пытается удалять элементы из List(Of T) внутри For Each. Получает ошибку InvalidOperationException во время выполнения.
Плюсы:
Минусы:
** Позитивный кейс
Для удаления элементов выполняется перебор с конца с помощью обычного For:
For i = list.Count - 1 To 0 Step -1 If list(i) = "two" Then list.RemoveAt(i) End If Next
Плюсы:
Минусы: