Почему ключевое слово yield используется вместе с return и break, а не само по себе?


11

В C # вы можете создавать методы с возвращаемым типом IEnumerable<T>и использовать yield returnи yield breakдля управления потоком. Вот простой пример, который использует оба элемента управления:

public IEnumerable<int> GetEvens(int start, int end) {
    if(end < start)
        yield break;

    if(start & 2 != 0)
        start++;

    for(int i = start; i <= end; i+=2) {
        yield return i;
    }        
}

Мой вопрос заключается в том, почему он изначально был разработан, чтобы использовать два ключевых слова, yieldа не использовать их, как показано ниже, с одним yield«возвращаемым значением»:

public IEnumerable<int> GetEvens(int start, int end) {
    if(end < start)
        return; // stop completely and return nothing

    if(start & 2 != 0)
        start++;

    for(int i = start; i <= end; i+=2) {
        yield i; // yield the current value.
    }        
}

Для меня это проще читать и понимать.

Ответы:


13

Слегка неловкий yield returnсинтаксис был создан таким образом, чтобы существующий код, который использовал слово «yield» в качестве идентификатора (имя переменной), не ломался . (Имеет смысл, например, иметь переменную с именем, yieldесли вы работаете с финансовым кодом.) Поскольку тогда «yield return» был бы синтаксической ошибкой, новый синтаксис не сломал бы любой существующий код.

Что касается yield break, без понятия. Кажется, у этого действительно нет веской причины, которую я могу найти.


Не было ли yield x;также синтаксической ошибкой тогда?
Moop

1
@Moop: Делая это yield return, вам даже не нужно беспокоиться о том, была ли это синтаксическая ошибка или нет. Вероятность столкновения становится равной нулю.
Роберт Харви

2
Для "yield break" это по сути как "return;" в пустом методе, но с использованием «return»; в сочетании с «доходностью возврата»; может быть запутанным. Таким образом, выбор «доходности» является следствием выбора «доходности».
Cyanfish

3
@Moop , если у вас тип имени , yieldто yield x;не будет синтаксической ошибкой, но действительное объявление переменной.
Боян Резник

1
@moop: См. также ericlippert.com/2009/05/11/reserved-and-contextual-keywords and blogs.msdn.com/b/ericlippert/archive/2010/09/27/…, если предмет введения новых ключевых слов без нарушение любого кода вас интересует.
Эрик Липперт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.