yield (Referenční dokumentace jazyka C#)

Při použití yield klíčového slova kontextové v příkazu označíte, že metoda, operátor nebo get přistupující objekt, ve kterém se zobrazí, je iterátor. Použití yield k definování iterátoru odstraní nutnost explicitní třídy extra (třída, která obsahuje stav pro výčet, viz IEnumerator<T> příklad) při implementaci IEnumerable IEnumerator vzor a pro vlastní typ kolekce.

Následující příklad ukazuje dva formy yield příkazu.

yield return <expression>;
yield break;

Poznámky

Použijete yield return příkaz k vrácení každého prvku v jednom okamžiku.

Sekvenci vrácenou metodou iterátoru lze spotřebovat pomocí příkazu foreach nebo dotazu LINQ. Každá iterace foreach smyčky volá metodu iterátoru. Je-li yield return v metodě iterátoru dosaženo příkazu, expression je vráceno a aktuální umístění v kódu je uchováno. Provádění je restartováno ze zmíněného umístění pokaždé, když je zavolána funkce iterátoru.

yield breakK ukončení iterace můžete použít příkaz.

Další informace o iterátorech naleznete v tématu iterátory.

Metody iterátoru a přistupující objekty get

Deklarace iterátoru musí splňovat následující požadavky:

yieldTyp iterátoru, který vrací IEnumerable nebo IEnumerator je object . Pokud iterátor vrátí IEnumerable<T> nebo IEnumerator<T> , musí být implicitní převod z typu výrazu v yield return příkazu na parametr obecného typu.

Nemůžete zahrnout yield return yield break příkaz ani do:

Ošetření výjimek

yield returnPříkaz se nemůže nacházet v bloku try-catch. yield returnPříkaz lze umístit do bloku try příkazu try-finally.

yield breakPříkaz se může nacházet v bloku try nebo bloku catch, ale ne v bloku finally.

Pokud foreach tělo (mimo metodu iterátoru) vyvolá výjimku, finally je spuštěn blok v metodě iterátoru.

Technická implementace

Následující kód vrátí IEnumerable<string> z metody iterátoru a pak projde jeho prvky.

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

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

V iteraci foreach smyčky MoveNext je metoda volána pro elements . Toto volání provede tělo MyIteratorMethod až do yield return dosažení dalšího příkazu. Výraz vrácený yield return příkazem určuje nejen hodnotu element proměnné pro spotřebu v těle smyčky, ale také Current vlastnost objektu elements , což je IEnumerable<string> .

Při každém následném opakování foreach smyčky pokračuje provádění textu iterátoru z místa, kde bylo ponecháno, opětovné zastavení při dosažení yield return příkazu. foreachSmyčka skončí po dosažení konce metody iterátoru nebo yield break příkazu.

Příklad

Následující příklad obsahuje yield return příkaz, který je uvnitř for smyčky. Každá iterace foreach těla příkazu v Main metodě vytvoří volání Power funkce iterátoru. Každé volání funkce iterátoru pokračuje k dalšímu provedení yield return příkazu, ke kterému dojde během další iterace for smyčky.

Návratový typ metody iterátoru je IEnumerable , což je typ rozhraní iterátoru. Při volání metody iterátoru je vrácen vyčíslitelný objekt, který obsahuje mocniny čísla.

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
}

Příklad

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

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 najdete 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é