Когда выполняется итерационное выражение цикла for

Обновлено: 03.07.2024

Следующие операторы многократно выполняют инструкцию или блок инструкций:

    : выполняет тело, а заданное логическое выражение принимает значение true . : перечисляет элементы коллекции и выполняет тело для каждого элемента коллекции. : условно выполняет тело один или несколько раз. : условно выполняет тело ноль или более раз.

Цикл можно прервать в любой момент в теле оператора итерации с помощью оператора break. Кроме того, можно перейти к следующей итерации в цикле с помощью оператора continue.

Инструкция for

Оператор for выполняет оператор или блок операторов, пока определенное логическое выражение равно значению true . В следующем примере показана инструкция for , выполняющая тело пока целочисленный счетчик меньше трех:

В предыдущем примере показаны элементы оператора for :

Раздел инициализатора, который выполняется только один раз перед входом в цикл. Как правило, в этом разделе объявляется и инициализируется локальная переменная цикла. Доступ к объявленной переменной извне оператора for невозможен.

В разделе инициализатора в предыдущем примере объявляется и инициализируется целочисленная переменная-счетчик:

Раздел условия, в котором определяется, следует ли выполнять следующую итерацию в цикле. Если для него получено значение true или значение отсутствует, выполняется следующая итерация; в противном случае цикл завершается. Раздел условия должен быть логическим выражением.

В разделе условия в предыдущем примере проверяется, меньше ли трех значение счетчика.

Раздел итератора, который определяет, что происходит после каждого выполнения тела цикла.

Раздел итератора в предыдущем примере увеличивает значение счетчика:

Тело цикла которое должно быть оператором или блоком операторов.

Раздел итератора может содержать ноль или более следующих выражений оператора, разделенных запятыми:

  • префиксное или постфиксное выражение приращения, такое как ++i или i++
  • префиксное или постфиксное выражение декремента, такое как --i или i--
  • вызов метода
  • выражение await
  • создание объекта с помощью оператора new

Если переменная цикла не объявлена в разделе инициализатора, в разделе инициализатора можно также использовать ноль или более выражений из предыдущего списка. В следующем примере показано несколько менее распространенных вариантов использования разделов инициализатора и итератора: присваивание значения внешней переменной цикла в разделе инициализатора, вызов метода в разделах инициализатора и итератора и изменение значения двух переменных в разделе итератора.

Все разделы оператора for необязательны. Например, в следующем коде определяется бесконечный цикл for :

Инструкция foreach

Оператор foreach выполняет оператор или блок операторов для каждого элемента в экземпляре типа, который реализует интерфейс System.Collections.IEnumerable или System.Collections.Generic.IEnumerable<T>, как показано в следующем примере.

Оператор foreach не ограничен этими типами. Его можно использовать с экземпляром любого типа, который удовлетворяет следующим условиям:

В следующем примере показано использование оператора foreach с экземпляром типа System.Span<T>, который не реализует интерфейс:

Если оператор foreach применяется к null , возникает исключение NullReferenceException. Если исходная коллекция инструкции foreach пуста, тело оператора foreach не выполняется и пропускается.

await foreach

Оператор await foreach можно также использовать с экземпляром любого типа, который удовлетворяет следующим условиям:

  • Тип имеет открытый метод без параметров GetAsyncEnumerator . Этот метод может быть методом расширения типа.
  • Тип возвращаемого значения метода GetAsyncEnumerator имеет открытое свойство Current и открытый метод без параметров MoveNextAsync , тип возвращаемого значения которого — Task<bool> , ValueTask<bool> или любой другой подтверждающий ожидание тип, метод ожидания которого GetResult возвращает значение bool .

Тип переменной итерации

Можно использовать ключевое слово var , чтобы компилятор мог определить тип переменной итерации в операторе foreach , как показано в следующем коде:

Можно также явно указать тип переменной итерации, как показано в следующем коде:

В предыдущей форме тип T элемента коллекции должен быть неявно или явно преобразован в тип V переменной итерации. Если явное преобразование из T в V завершается ошибкой во время выполнения, оператор foreach выдает исключение InvalidCastException. Например, если T является незапечатанным типом класса, V может быть любым типом интерфейса, даже тем, который T не реализует. Во время выполнения тип элемента коллекции может быть производным от T и фактически реализовать V . В противном случае возникает InvalidCastException.

Инструкция do

Оператор do выполняет оператор или блок операторов, пока определенное логическое выражение равно значению true . Так как это выражение оценивается после каждого выполнения цикла, цикл do выполняется один или несколько раз. Это отличает его от цикла while, который выполняется от нуля до нескольких раз.

В следующем примере показано применение оператора do .

Инструкция while

Оператор while выполняет оператор или блок операторов, пока определенное логическое выражение равно значению true . Так как это выражение оценивается перед каждым выполнением цикла, цикл while выполняется ноль или несколько раз. Это отличает его от цикла do, который выполняется от одного до нескольких раз.

В следующем примере показано применение оператора while .

Читайте также: