Condividi tramite


yield (Riferimenti per C#)

Quando si utilizza la parola chiave di yield in un'istruzione, si indica che il metodo, l'operatore o la funzione di accesso get in cui viene visualizzato un iteratore.Utilizzare un iteratore per eseguire un'iterazione personalizzata in una raccolta.Nell'esempio seguente vengono illustrati due form dell'istruzione di yield.

yield return <expression>;
yield break;

Note

Utilizzare un'istruzione di yield return per restituire ogni elemento uno alla volta.

Utilizzare un metodo iteratori utilizzando un'istruzione o una query LINQ di l'istruzione foreach.Ogni iterazione del ciclo di foreach chiama il metodo di iteratore.Quando un'istruzione di yield return viene raggiunto il metodo di iteratore, expression viene restituito e la posizione corrente nel codice vengono mantenute.L'esecuzione verrà riavviata da tale percorso alla successiva apertura della funzione di iteratore è denominata.

È possibile utilizzare un'istruzione di yield break per terminare l'iterazione.

Per ulteriori informazioni sugli iteratori, vedere Iteratori (C# e Visual Basic).

Metodi e funzioni di accesso get di iteratore

La dichiarazione di un iteratore deve soddisfare i seguenti requisiti:

Una conversione implicita deve esistere dal tipo di un'espressione nell'istruzione di yield return al tipo restituito dell'iteratore.

Non è possibile includere un'istruzione di yield break o di yield return nei metodi che presentano le caratteristiche seguenti:

Gestione delle eccezioni

Un'istruzione di yield return non può trovarsi in un blocco try-catch.Un'istruzione di yield return può essere contenuto nel blocco try try-finally di un'istruzione.

Un'istruzione di yield break può trovarsi in un blocco try o in un blocco catch ma non in un altro blocco finally.

Se il corpo di foreach (esterni al metodo iteratori) genera un'eccezione, un blocco di finally nel metodo di iteratore viene eseguito.

Implementazione tecnica

Il codice seguente restituisce IEnumerable<string> da un metodo iteratori e quindi scorre i relativi elementi.

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

La chiamata a MyIteratorMethod non esegue il corpo del metodo.Anziché la chiamata IEnumerable<string> nella variabile di elements.

In un'iterazione del ciclo di foreach, il metodo di MoveNext viene chiamato per elements.Questa chiamata viene eseguito il corpo di MyIteratorMethod fino a raggiungere la successiva istruzione di yield return.L'espressione restituita dall'istruzione di yield return determina non solo il valore della variabile di element per l'utilizzo dal corpo del ciclo ma anche la proprietà di Current di elementi, che è IEnumerable<string>.

In ogni iterazione successiva del ciclo di foreach, l'esecuzione del corpo iteratori continua da dove era stato interrotto, ancora arrestando quando raggiunge un'istruzione di yield return.Il ciclo di foreach completa quando la fine del metodo iteratori o un'istruzione di yield break viene soddisfatta.

Esempio

L'esempio seguente contiene un'istruzione di yield return presente in un ciclo di for.Ogni iterazione del corpo dell'istruzione foreach in Process crea una chiamata alla funzione iteratore di Power.Ogni chiamata alla funzione iteratori procederà all'esecuzione di un'istruzione di yield return, che si verifica durante l'iterazione successiva del ciclo di for.

Il tipo restituito del metodo di iteratore è IEnumerable, che è un tipo di interfaccia iteratori.Quando il metodo di iteratore viene chiamato, restituisce un oggetto enumerabile che include potenze di un numero.

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
}

Il seguente esempio viene illustrata una funzione di accesso get che è un iteratore.Nell'esempio, ogni istruzione di yield return restituisce un'istanza di una classe definita dall'utente.

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

Specifiche del linguaggio C#

Per ulteriori informazioni, vedere la Specifiche del linguaggio C#. La specifica del linguaggio è la fonte ufficiale per la sintassi e l'utilizzo di C#.

Vedere anche

Riferimenti

foreach, in (Riferimenti per C#)

Concetti

Guida per programmatori C#

Altre risorse

Riferimenti per C#

Iteratori (C# e Visual Basic)