Looking for c# Keywords? Try Ask4Keywords

C# Language Разница между разрывом и выходом


пример

Использование yield break в отличие от break может быть не столь очевидным, как можно подумать. В Интернете много плохих примеров, где использование этих двух взаимозаменяемых и на самом деле не демонстрирует разницы.

Запутанная часть состоит в том, что оба ключевых слова (или ключевые фразы) имеют смысл только внутри циклов ( foreach , while ...). Когда выбирать один за другим?

Важно понимать, что как только вы используете ключевое слово yield в методе, вы эффективно превращаете этот метод в итератор . Единственная цель такого метода состоит в том, чтобы затем перебирать конечный или бесконечный набор и выводить (выводить) его элементы. Как только цель будет выполнена, нет причин продолжать выполнение метода. Иногда это происходит, естественно, с последней закрывающей скобкой метода } . Но иногда вы хотите досрочно завершить метод. В обычном (без повторения) методе вы должны использовать ключевое слово return . Но вы не можете использовать return в итераторе, вы должны использовать yield break . Другими словами, yield break для итератора совпадает с return стандартного метода. Принимая во внимание, что оператор break просто завершает ближайший цикл.

Давайте посмотрим несколько примеров:

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