Condividi tramite


yield (Riferimenti per C#)

La parola chiave yield segnala al compilatore che il metodo in cui è presente è un blocco iterator. Il compilatore genera una classe per implementare il comportamento espresso nel blocco iterator. Nel blocco iterator la parola chiave yield viene utilizzata insieme alla parola chiave return per fornire un valore all'oggetto enumeratore. Si tratta del valore restituito, ad esempio, in ogni ciclo di un'istruzione foreach. La parola chiave yield viene utilizzata anche con break per segnalare la fine dell'iterazione. Per ulteriori informazioni sugli iteratori, vedere Iteratori (Guida per programmatori C#). Nell'esempio seguente vengono illustrate le due forme dell'istruzione yield.

yield return <expression>;
yield break;

Note

In un'istruzione yield return, l'oggetto expression viene valutato e restituito come valore all'oggetto enumeratore. È necessario poter convertire in modo implicito expression al tipo restituito dell'iteratore.

In un'istruzione yield break il controllo viene restituito incondizionatamente al chiamante dell'iteratore, che è il metodo IEnumerator.MoveNext (o la sua controparte generica System.Collections.Generic.IEnumerable<T>) o il metodo Dispose dell'oggetto enumeratore.

L'istruzione yield può essere presente soltanto all'interno di un blocco iterator, che può essere implementato come corpo di un metodo, di un operatore o di una funzione di accesso. Il corpo di tali metodi, operatori o funzioni di accesso è controllato dalle seguenti limitazioni:

  • Non sono consentiti i blocchi unsafe.

  • I parametri per il metodo, l'operatore o la funzione di accesso non possono essere ref o out.

  • Non è possibile individuare un'istruzione yield return all'interno di un blocco try-catch. Tale istruzione si può trovare in un blocco try se il blocco try è seguito da un blocco finally.

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

Un'istruzione yield non può essere presente in un metodo anonimo. Per ulteriori informazioni, vedere Metodi anonimi (Guida per programmatori C#).

Quando viene utilizzata con expression, un'istruzione yield return non può essere presente in un blocco catch o in un blocco try con una o più clausole catch. Per ulteriori informazioni, vedere Istruzioni di gestione delle eccezioni (Riferimenti per C#).

Esempio

Nell'esempio riportato di seguito, l'istruzione yield viene utilizzata all'interno di un blocco iteratore, che è il metodo Power(int number, int power). Quando il metodo Power viene richiamato, restituisce un oggetto enumerabile che contiene le potenze di un numero. Si noti che il tipo restituito del metodo Power è System.Collections.IEnumerable, un tipo di interfaccia iteratore.

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 
*/

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#)

Utilizzo di iteratori (Guida per programmatori C#)

Concetti

Guida per programmatori C#

Altre risorse

Riferimenti per C#