C# Language La différence entre break et break


Exemple

Utiliser la yield break par opposition à la break pourrait ne pas être aussi évidente qu'on pourrait le penser. Il y a beaucoup de mauvais exemples sur Internet où l'utilisation des deux est interchangeable et ne démontre pas vraiment la différence.

La partie déroutante est que les deux mots-clés (ou phrases-clés) n'ont de sens que dans les boucles ( foreach , while ...) Alors, quand choisir l'un sur l'autre?

Il est important de réaliser qu'une fois que vous utilisez le mot-clé yield dans une méthode, vous transformez la méthode en itérateur . Le seul but de cette méthode est alors d’itérer sur une collection finie ou infinie et de produire (produire) ses éléments. Une fois l'objectif atteint, il n'y a aucune raison de continuer l'exécution de la méthode. Parfois, cela se produit naturellement avec le dernier crochet de fermeture de la méthode } . Mais parfois, vous voulez mettre fin à la méthode prématurément. Dans une méthode normale (non itérative), vous utiliseriez le mot-clé return . Mais vous ne pouvez pas utiliser return dans un itérateur, vous devez utiliser yield break . En d' autres termes, la yield break pour un itérateur est le même que le return d'une méthode normalisée. Alors que l'instruction break fait que terminer la boucle la plus proche.

Voyons quelques exemples:

    /// <summary>
    /// Yields numbers from 0 to 9
    /// </summary>
    /// <returns>{0,1,2,3,4,5,6,7,8,9}</returns>
    public static IEnumerable<int> YieldBreak()
    {
        for (int i = 0; ; i++)
        {
            if (i < 10)
            {
                // Yields a number
                yield return i;
            }
            else
            {
                // Indicates that the iteration has ended, everything 
                // from this line on will be ignored
                yield break;
            }
        }
        yield return 10; // This will never get executed
    }
    /// <summary>
    /// Yields numbers from 0 to 10
    /// </summary>
    /// <returns>{0,1,2,3,4,5,6,7,8,9,10}</returns>
    public static IEnumerable<int> Break()
    {
        for (int i = 0; ; i++)
        {
            if (i < 10)
            {
                // Yields a number
                yield return i;
            }
            else
            {
                // Terminates just the loop
                break;
            }
        }
        // Execution continues
        yield return 10;
    }