Чому ключове слово дохідність використовується в поєднанні з поверненням і перервою, а не само собою?


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 break, ідеї немає. Насправді, схоже, немає поважних причин, які я можу знайти.


Чи yield x;теж тоді не було помилки синтаксису?
Moop

1
@Moop: Роблячи це yield return, вам навіть не потрібно турбуватися про те, чи була синтаксична помилка чи ні. Шанс зіткнення стає нульовим.
Роберт Харві

2
Для "перерва врожайності", це по суті як "повернення;" у недійсному методі, але з використанням "return;" у поєднанні з "віддачею прибутку;" може заплутати. Тож вибір "перерви врожайності" є наслідком вибору "прибутку".
Cyanfish

3
@Moop , якщо у вас тип імені , yieldто yield x;НЕ буде синтаксичної помилкою, але дійсне оголошення змінної.
Боян Резник

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