yield (справочник по C#)

Ключевое слово yield сообщает компилятору, что метод, в котором оно содержится, является блоком итератора. Для реализации поведения, определенного в блоке итератора, компилятор создает класс. В блоке итератора ключевое слово yield используется совместно с ключевым словом return для предоставления значения объекту перечислителя, например значения, возвращаемого в каждом цикле оператора foreach. Ключевое слово yield всегда используется вместе с ключевым словом break для обозначения конца итерации. Дополнительные сведения об итераторах см. в разделе Итераторы (Руководство по программированию в C#). В следующем примере показаны две формы оператора yield.

yield return <expression>;
yield break;

Заметки

В операторе yield return выражение expression вычисляется и возвращается в виде значения объекту перечислителя; выражение expression должно неявно преобразовываться в тип результата итератора.

В операторе yield break управление безусловно передается вызывающему коду итератора, которым является метод IEnumerator.MoveNext (или его универсальный эквивалент System.Collections.Generic.IEnumerable<T>) либо метод Dispose объекта перечислителя.

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

  • Использование небезопасных блоков не допускается.

  • Параметры метода, оператора или метода доступа не могут иметь значение ref или out.

  • Оператор yield return не может располагаться внутри блока try-catch. Он может располагаться в блоке try, если за ним следует блок finally.

  • Оператор yield break может располагаться в блоке try или catch, но не внутри блока finally.

Оператор yield не может использоваться в анонимных методах. Дополнительные сведения см. в разделе Анонимные методы (Руководство по программированию в C#).

При использовании с expression инструкция yield return не может размещаться в блоке catch или в блоке try, имеющем одно или более предложений catch. Дополнительные сведения см. в разделе Операторы обработки исключений (Справочник по C#).

Пример

В следующем примере инструкция yield используется внутри блока итератора, который является методом Power(int number, int power). При вызове метода Power он возвращает перечисляемый объект, который содержит степени числа. Обратите внимание, что типом возвращаемого значения метода Power является System.Collections.IEnumerable, тип интерфейса итератора.

public class List
{
    //using System.Collections;
    public static IEnumerable Power(int number, int exponent)
    {
        int counter = 0;
        int result = 1;
        while (counter++ < exponent)
        {
            result = result * number;
            yield return result;
        }
    }

    static void Main()
    {
        // Display powers of 2 up to the exponent 8:
        foreach (int i in Power(2, 8))
        {
            Console.Write("{0} ", i);
        }
    }
}
/*
Output:
2 4 8 16 32 64 128 256 
*/

Спецификация языка C#

Дополнительные сведения см в Спецификация языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

Ссылки

foreach, in (Справочник по C#)

Использование итераторов (Руководство по программированию в C#)

Основные понятия

Руководство по программированию на C#

Другие ресурсы

Справочник по C#