Partager via


yield (Référence C#)

Lorsque vous utilisez le mot clé d' yield dans une instruction, vous indiquez que la méthode, l'opérateur, ou l'utilisateur d' get dans lequel elle apparaît est un itérateur.Vous utilisez un itérateur pour effectuer une itération personnalisée sur une collection.L'exemple suivant illustre les deux formes de l'instruction d' yield .

yield return <expression>;
yield break;

Notes

Utilisez une instruction d' yield return pour retourner les éléments un par un.

Vous consommez une méthode d'itérateur en utilisant une instruction ou d'une requête LINQ d' foreach .Chaque itération de la boucle d' foreach appelle la méthode de l'itérateur.Lorsqu'une instruction d' yield return atteinte dans la méthode d'itérateur, expression est retourné, et la position actuelle dans le code est conservée.L'exécution est redémarrée de cet emplacement à la prochaine fois que la fonction d'itérateur est appelé.

Vous pouvez utiliser une instruction d' yield break pour terminer l'itération.

Pour plus d'informations sur les itérateurs, consultez Itérateurs (C# et Visual Basic).

Utilisateurs de méthodes et get itérateur

La déclaration d'un itérateur doit répondre aux conditions suivantes :

Une conversion implicite doit exister du type d'expression dans l'instruction d' yield return au type de retour de l'itérateur.

Vous ne pouvez pas incorporer une instruction d' yield return ou d' yield break dans les méthodes qui ont les caractéristiques suivantes :

Gestion des exceptions

Une instruction d' yield return ne peut pas se trouver dans un bloc try-catch.Une instruction d' yield return peut se trouver dans le bloc try d'une instruction de try-finally.

Une instruction d' yield break peut se trouver dans un bloc try ou un bloc catch mais pas un bloc finally.

Si le corps d' foreach (en dehors de la méthode d'itérateur) lève une exception, un bloc d' finally dans la méthode d'itérateur est exécuté.

Implémentation technique

Le code suivant retourne IEnumerable<string> d'une méthode d'itérateur puis itère au sein de ses éléments.

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

L'appel à MyIteratorMethod n'exécute pas le corps de la méthode.À la place l'appel retourne IEnumerable<string> dans la variable d' elements .

Sur une itération de la boucle d' foreach, la méthode d' MoveNext est appelée pour elements.Cet appel exécute le corps d' MyIteratorMethod jusqu'à ce que l'instruction suivante d' yield return soit atteinte.L'expression retournée par l'instruction d' yield return détermine non seulement la valeur de la variable d' element en vue de leur utilisation par le corps de la boucle mais également la propriété d' Current des éléments, qui est IEnumerable<string>.

Pour chaque itération suivante de la boucle d' foreach, l'exécution du corps des itérateurs continue à laquelle elle a été arrêté, de nouveau arrêtant lorsqu'elle atteint une instruction d' yield return .La boucle d' foreach se termine lorsque la fin de la méthode d'itérateur ou d'une instruction d' yield break est atteinte.

Exemple

L'exemple suivant présente une instruction d' yield return qui est à l'intérieur d'une boucle d' for .Chaque itération du corps d'instruction d' foreach dans Process crée un appel à la fonction d'itérateur d' Power .Chaque appel à la fonction d'itérateur continue à la prochaine exécution de l'instruction d' yield return, qui se produit pendant l'itération suivante de la boucle d' for .

Le type de retour de la méthode d'itérateur est IEnumerable, qui est un type d'interface d'itérateur.Lorsque la méthode d'itérateur est appelée, elle retourne un objet énumérable qui contient les puissances d'un nombre.

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
}

L'exemple suivant montre un utilisateur d' get qui est un itérateur.Dans l'exemple, chaque instruction d' yield return retourne une instance d'une classe définie par l'utilisateur.

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

Spécification du langage C#

Pour plus d'informations, consultez la Spécification du langage C#. La spécification du langage est la source de référence pour la syntaxe C# et son utilisation.

Voir aussi

Référence

foreach, in (référence C#)

Concepts

Guide de programmation C#

Autres ressources

Référence C#

Itérateurs (C# et Visual Basic)