Sdílet prostřednictvím


výnos (C#-Reference)

yield Klíčové slovo označuje, že metoda, operátor, nebo get přistupující objekt, ve kterém se je iterátor.Provést vlastní iterace v kolekci pomocí iterace.Následující příklad ukazuje dvě formy yield prohlášení.

yield return <expression>;
yield break;

Poznámky

Použití yield return příkaz vrátit každý prvek v čase.

Spotřebovat iterační metodu pomocí foreach příkaz nebo dotazu LINQ.Každá iterace foreach smyčka volá iterační metodu.Při yield return prohlášení je dosaženo v iterační metoda expression je vrácena a zachovány aktuální umístění v kódu.Spuštění z tohoto umístění restartován při příštím iterační funkce je volána.

Můžete použít yield break příkaz iterace.

Další informace o iterátory, viz U iterátorů (C# a Visual Basic).

Metody iterace a přístupové objekty get

Při použití yield return nebo yield break prohlášení, označení, že metoda, operátor, nebo get přistupující objekt, ve kterém se je iterátor.Prohlášení iterátor metoda, operátor, nebo get přistupující objekt musí splňovat následující požadavky:

Musí existovat implicitní převod z typu výrazu yield return příkaz návratový typ iterace.

A yield return nebo yield break prohlášení nemohou být umístěna v metody, které mají následující charakteristiky:

Zpracování výjimek

A yield return prohlášení nemohou být umístěna v bloku try-catch.A yield return příkaz může být umístěn v bloku try příkazu try-finally.

A yield break příkaz může být umístěn v bloku try nebo blok catch, ale ne finally blok.

Pokud foreach subjektu (mimo iterační metoda) vyvolá výjimku, finally proveden bloku v iterační metodu.

Technické provedení

Následující kód vrátí IEnumerable<string> z iterační metodu a pak prochází jeho prvky.

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

Volání MyIteratorMethod neprovede těla metody.Místo volání vrátí IEnumerable<string> do elements proměnné.

Na iterace foreach smyčky, MoveNext je volána metoda elements.Toto volání provede těla MyIteratorMethod až do dalšího yield return dosaženo příkazu.Výraz vrácený yield return prohlášení určuje pouze hodnotu element proměnné pro spotřebu subjektem smyčky, ale také Current vlastnosti prvků, která je IEnumerable<string>.

Při každé následné opakování foreach smyčka pokračuje spuštění iterátor subjektu, kde přestali, zastavení znovu dosáhne yield return prohlášení.foreach Po dokončení smyčky konec metody iterace nebo yield break dosaženo příkazu.

Další informace naleznete Další informace naleznete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.
.

Příklad

V následujícím příkladu má yield return příkaz, který je uvnitř for smyčky.Každá iterace foreach prohlášení subjektu v Process vytvoří volání Power iterační funkce.Každé volání funkce iterační pokračuje další provádění yield return příkazu dojde při dalším opakování for smyčky.

Návratový typ metody iterace je IEnumerable, což je typ rozhraní iterator.Při volání metody iterace vrátí vyčíslitelné objekt, který obsahuje řadu pravomocí.

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.IEnumerable 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
}

Následující příklad ukazuje get přistupující objekt, který je iterátor.V příkladu každý yield return příkaz vrátí instanci třídy definované uživatelem.

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; }
    }
}

Specifikace jazyka C#

Další informace naleznete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.

Viz také

Referenční dokumentace

foreach (C# odkazu)

Koncepty

Příručka programování C#

Další zdroje

C#-Reference

U iterátorů (C# a Visual Basic)