Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

10.14.4.1Метод MoveNext

Метод MoveNext объекта перечислителя инкапсулирует код блока итератора. При вызове метода MoveNext выполняется код в блоке итератора и устанавливается соответствующее свойство Current объекта перечислителя. Точное действие, выполняемое MoveNext, зависит от состояния объекта перечислителя при вызове MoveNext:

  • Если объект перечислителя находится в состоянии before, то при вызове MoveNext:

  • состояние меняется на running;

  • инициализируются параметры (включая this) блока итератора значениями аргументов и значением экземпляра, сохраненными при инициализации объекта перечислителя;

  • выполняется блок итератора от начала и до тех пор, пока выполнение не будет прервано (как описано ниже).

  • Если состояние объекта перечислителя running, результат вызова MoveNext не определен.

  • Если состояние объекта перечислителя suspended, при вызове MoveNext:

  • состояние меняется на running;

  • восстанавливаются значения всех локальных переменных и параметров (включая this) к значениям, сохраненным при последней приостановке выполнения блока итератора. Обратите внимание, что содержимое любых объектов, на которые ссылаются эти переменные, могло измениться со времени предыдущего вызова MoveNext;

  • возобновляется выполнение блока итератора с оператора, непосредственно следующего за оператором yield return, вызвавшим приостановку выполнения, и продолжается до тех пор, пока выполнение не будет прервано (как описано ниже).

  • Если состояние объекта перечислителя after, при вызове MoveNext возвращается false.

Когда MoveNext выполняет блок итератора, выполнение может быть прервано четырьмя способами: оператором yield return, оператором yield break, по концу блока итератора и инициированным исключением, распространенным из блока итератора.

  • Если встретился оператор yield return (§8.14):

  • выражение, заданное в операторе, вычисляется, неявно преобразуется к типу yield и присваивается свойству Current объекта перечислителя;

  • выполнение тела итератора приостанавливается. Значения всех локальных переменных и параметров (включая this) сохраняются, как и место этого оператора yield return. Если оператор yield return находится внутри одного или более блоков try, их соответствующие блоки finally не выполняются в это время;

  • состояние объекта перечислителя меняется на suspended;

  • метод MoveNext возвращает true вызвавшему его, указывая этим, что итерация успешно продвинулась к следующему значению.

  • Если встретился оператор yield break (§8.14):

  • если оператор yield break находится внутри одного или более блоков try, соответствующие им блоки finally выполняются;

  • состояние объекта перечислителя меняется на after;

  • метод MoveNext возвращает false вызвавшему его, указывая этим, что итерация выполнена.

  • Если встретился конец тела итератора:

  • состояние объекта перечислителя меняется на after;

  • метод MoveNext возвращает false вызвавшему его, указывая этим, что итерация выполнена.

  • Если инициируется исключение и распространяется из блока итератора:

  • соответствующие блоки finally в теле итератора будут выполняться распространением исключения;

  • состояние объекта перечислителя меняется на after;

  • распространение исключения продолжается до вызвавшего метод MoveNext.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]