yield (odwołanie w C#)yield (C# Reference)

Kiedy używasz yield kontekstowego słowa kluczowego w instrukcji powoduje wskazanie metody, operatora lub get dostępu, w której występuje jest iteratorem.When you use the yield contextual keyword in a statement, you indicate that the method, operator, or get accessor in which it appears is an iterator. Za pomocą yield do zdefiniowania iteratora eliminuje konieczność jawnego użycia dodatkowej klasy (klasy przechowującej stan wyliczenia, zobacz IEnumerator<T> przykład) podczas implementacji IEnumerable i IEnumerator wzorca dla kolekcji niestandardowej Typ.Using yield to define an iterator removes the need for an explicit extra class (the class that holds the state for an enumeration, see IEnumerator<T> for an example) when you implement the IEnumerable and IEnumerator pattern for a custom collection type.

W poniższym przykładzie pokazano dwa rodzaje yield instrukcji.The following example shows the two forms of the yield statement.

yield return <expression>;
yield break;

UwagiRemarks

Możesz użyć yield return instrukcja zwraca każdy element w danym momencie.You use a yield return statement to return each element one at a time.

Korzystanie z metody iteratora przy użyciu foreach instrukcji lub zapytania LINQ.You consume an iterator method by using a foreach statement or LINQ query. Każda iteracja foreach pętli wywołuje metodę iteratora.Each iteration of the foreach loop calls the iterator method. Gdy yield return osiągnięciu instrukcji w metodzie iteratora expression jest zwracany, a bieżąca lokalizacja w kodzie jest zachowywana.When a yield return statement is reached in the iterator method, expression is returned, and the current location in code is retained. Wykonanie jest uruchamiane ponownie z tej lokalizacji przy następnym wywołaniu funkcji iteratora.Execution is restarted from that location the next time that the iterator function is called.

Możesz użyć yield break instrukcję, aby zakończyć iterację.You can use a yield break statement to end the iteration.

Aby uzyskać więcej informacji dotyczących iteratorów, zobacz Iteratory.For more information about iterators, see Iterators.

Metody iteratorów i metody dostępu getIterator methods and get accessors

Deklaracja iteratora musi spełniać następujące wymagania:The declaration of an iterator must meet the following requirements:

yield Typ iteratora zwracającego IEnumerable lub IEnumerator jest object.The yield type of an iterator that returns IEnumerable or IEnumerator is object. Jeśli iterator zwraca IEnumerable<T> lub IEnumerator<T>, musi istnieć niejawna konwersja z typu wyrażenia w yield return instrukcję, aby parametr typu ogólnego.If the iterator returns IEnumerable<T> or IEnumerator<T>, there must be an implicit conversion from the type of the expression in the yield return statement to the generic type parameter .

Nie można uwzględnić yield return lub yield break instrukcji w metodach mających następujące cechy:You can't include a yield return or yield break statement in methods that have the following characteristics:

  • Metody anonimowe.Anonymous methods. Aby uzyskać więcej informacji, zobacz anonimowymi.For more information, see Anonymous Methods.

  • Metody, które zawierają bloki ze słowem kluczowym unsafe.Methods that contain unsafe blocks. Aby uzyskać więcej informacji, zobacz niebezpieczne.For more information, see unsafe.

Obsługa wyjątkówException handling

A yield return instrukcja nie może znajdować się w bloku try-catch.A yield return statement can't be located in a try-catch block. A yield return instrukcji może znajdować się w bloku try instrukcji try-finally.A yield return statement can be located in the try block of a try-finally statement.

A yield break instrukcji może znajdować się w bloku try lub bloku catch, ale nie bloku finally.A yield break statement can be located in a try block or a catch block but not a finally block.

Jeśli foreach treści (poza metodą iteratora) zgłasza wyjątek, finally blokowanie w metodzie iteratora jest wykonywany.If the foreach body (outside of the iterator method) throws an exception, a finally block in the iterator method is executed.

Implementacja technicznaTechnical implementation

Poniższy kod zwraca IEnumerable<string> z metody iteratora i następnie iterację przez jego elementów.The following code returns an IEnumerable<string> from an iterator method and then iterates through its elements.

IEnumerable<string> elements = MyIteratorMethod();
foreach (string element in elements)
{
   ...
}

Wywołanie MyIteratorMethod treści metody nie jest wykonywany.The call to MyIteratorMethod doesn't execute the body of the method. Zamiast tego to wywołanie zwraca IEnumerable<string> do elements zmiennej.Instead the call returns an IEnumerable<string> into the elements variable.

Podczas iteracji foreach pętli, MoveNext metoda jest wywoływana dla elements.On an iteration of the foreach loop, the MoveNext method is called for elements. To wywołanie wykonuje treść MyIteratorMethod aż do następnej yield return osiągnięta zostanie instrukcja.This call executes the body of MyIteratorMethod until the next yield return statement is reached. Wyrażenie zwracane przez yield return Instrukcja określa nie tylko wartość element do użycia w treści pętli, ale także Current właściwość elements, czyli IEnumerable<string>.The expression returned by the yield return statement determines not only the value of the element variable for consumption by the loop body but also the Current property of elements, which is an IEnumerable<string>.

Na poszczególnych kolejnych iteracjach foreach pętli, wykonywanie treści iteratora jest kontynuowane od miejsca zostało przerwane, zatrzymywane ponownie po osiągnięciu yield return instrukcji.On each subsequent iteration of the foreach loop, the execution of the iterator body continues from where it left off, again stopping when it reaches a yield return statement. foreach Pętli jest ukończone Kiedy koniec metody iteratora lub yield break osiągnięta zostanie instrukcja.The foreach loop completes when the end of the iterator method or a yield break statement is reached.

PrzykładExample

W poniższym przykładzie przedstawiono yield return instrukcji, która znajduje się wewnątrz for pętli.The following example has a yield return statement that's inside a for loop. Każda iteracja foreach treść instrukcji w Main metoda tworzy wywołanie Power funkcji iteratora.Each iteration of the foreach statement body in the Main method creates a call to the Power iterator function. Każde wywołanie funkcji iteratora przechodzi do następnego wykonania yield return instrukcję, która występuje w ciągu następnej iteracji for pętli.Each call to the iterator function proceeds to the next execution of the yield return statement, which occurs during the next iteration of the for loop.

Zwracany typ metody iteratora jest IEnumerable, który jest typem interfejsu iteratora.The return type of the iterator method is IEnumerable, which is an iterator interface type. Kiedy metoda iteratora jest wywoływana, zwraca obiekt wyliczeniowy, który zawiera potęgi liczb.When the iterator method is called, it returns an enumerable object that contains the powers of a number.

public class PowersOf2
{
    static void Main()
    {
        // Display powers of 2 up to the exponent of 8:
        foreach (int i in Power(2, 8))
        {
            Console.Write("{0} ", i);
        }
    }

    public static System.Collections.Generic.IEnumerable<int> Power(int number, int exponent)
    {
        int result = 1;

        for (int i = 0; i < exponent; i++)
        {
            result = result * number;
            yield return result;
        }
    }

    // Output: 2 4 8 16 32 64 128 256
}

PrzykładExample

W poniższym przykładzie pokazano get metodę dostępu, która jest iteratorem.The following example demonstrates a get accessor that is an iterator. W tym przykładzie każdy yield return instrukcja zwraca wystąpienie klasy zdefiniowanej przez użytkownika.In the example, each yield return statement returns an instance of a user-defined class.

public static class GalaxyClass
{
    public static void ShowGalaxies()
    {
        var theGalaxies = new Galaxies();
        foreach (Galaxy theGalaxy in theGalaxies.NextGalaxy)
        {
            Debug.WriteLine(theGalaxy.Name + " " + theGalaxy.MegaLightYears.ToString());
        }
    }

    public class Galaxies
    {

        public System.Collections.Generic.IEnumerable<Galaxy> NextGalaxy
        {
            get
            {
                yield return new Galaxy { Name = "Tadpole", MegaLightYears = 400 };
                yield return new Galaxy { Name = "Pinwheel", MegaLightYears = 25 };
                yield return new Galaxy { Name = "Milky Way", MegaLightYears = 0 };
                yield return new Galaxy { Name = "Andromeda", MegaLightYears = 3 };
            }
        }

    }

    public class Galaxy
    {
        public String Name { get; set; }
        public int MegaLightYears { get; set; }
    }
}

specyfikacja języka C#C# language specification

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#.For more information, see the C# Language Specification. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.The language specification is the definitive source for C# syntax and usage.

Zobacz takżeSee also