Что значит "уступить перерыв"; делать на C#?

Я видел этот синтаксис в MSDN: yield break, но не знаю, что 9X_yield-keyword он делает. Кто-нибудь знает?

572
1

  • Возврат доходности устраняет необходимость в списке поддержки, то есть вам не нужно кодировать ч ...
7
Общее количество ответов: 7

Ответ #1

Ответ на вопрос: Что значит "уступить перерыв"; делать на C#?

Указывает, что итератор подошел к концу. Вы 9X_.net можете рассматривать yield break как оператор return, который 9X_.net-framework не возвращает значения.

Например, если вы 9X_dotnet определяете функцию как итератор, тело функции 9X_csharp может выглядеть следующим образом:

for (int i = 0; i < 5; i++)
{
    yield return i;
}

Console.Out.WriteLine("You will see me");

Обратите 9X_c# внимание, что после того, как цикл завершит 9X_.net-framework все свои циклы, будет выполнена последняя 9X_.cs-file строка, и вы увидите сообщение в своем консольном 9X_visual-c# приложении.

Или вот так с yield break:

int i = 0;
while (true)
{
    if (i < 5)
    {
        yield return i;
    }
    else
    {
        // note that i++ will not be executed after this
        yield break;
    }
    i++;
}

Console.Out.WriteLine("Won't see me");

В этом случае 9X_c# последний оператор никогда не выполняется, потому 9X_visual-c# что мы преждевременно покинули функцию.

608
8

  • Может ли это быть просто «break» в ...

Ответ #2

Ответ на вопрос: Что значит "уступить перерыв"; делать на C#?

Завершает блок итератора (например, говорит, что 9X_c-sharp в IEnumerable больше нет элементов).

65
1

  • с [+1] - хотя академически итераторов в .NET нет. только счетчики (в одном направлении, вперед.)<p> ...

Ответ #3

Ответ на вопрос: Что значит "уступить перерыв"; делать на C#?

Сообщает итератору, что он достиг конца.

В 9X_yield-keyword качестве примера:

public interface INode
{
    IEnumerable GetChildren();
}

public class NodeWithTenChildren : INode
{
    private Node[] m_children = new Node[10];

    public IEnumerable GetChildren()
    {
        for( int n = 0; n < 10; ++n )
        {
            yield return m_children[ n ];
        }
    }
}

public class NodeWithNoChildren : INode
{
    public IEnumerable GetChildren()
    {
        yield break;
    }
}

33
0

Ответ #4

Ответ на вопрос: Что значит "уступить перерыв"; делать на C#?

yield в основном заставляет метод IEnumerable вести себя 9X_visual-c# аналогично кооперативному (а не превентивному) запланированному 9X_c#.net потоку.

yield return похож на поток, вызывающий функцию 9X_dotnet «расписание» или «сна», чтобы отказаться 9X_c#-language от управления процессором. Как и поток, метод 9X_c# IEnumerable восстанавливает элементы управления в точке 9X_.net-framework сразу после этого, при этом все локальные 9X_dotnet переменные имеют те же значения, что и до 9X_c-sharp потери управления.

yield break подобен потоку, достигающему 9X_csharp конца своей функции и завершающемуся.

Люди 9X_.net говорят о «конечном автомате», но конечный 9X_c#-language автомат - это все, что на самом деле является 9X_yield-keyword «потоком». У потока есть некоторое состояние 9X_yield-keyword (т.е. значения локальных переменных), и 9X_yield каждый раз, когда он запланирован, он предпринимает 9X_visual-c# некоторые действия, чтобы достичь нового 9X_c#-language состояния. Ключевым моментом в yield является 9X_.cs-file то, что, в отличие от потоков операционной 9X_.cs-file системы, к которым мы привыкли, код, который 9X_visual-c# его использует, замораживается во времени 9X_yield до тех пор, пока итерация не будет продвинута 9X_.cs-file вручную или завершена.

28
0

Ответ #5

Ответ на вопрос: Что значит "уступить перерыв"; делать на C#?

Оператор yield break останавливает перечисление. Фактически 9X_.net-framework yield break завершает перечисление, не возвращая никаких 9X_.net-framework дополнительных элементов.

Учтите, что на 9X_yield-keyword самом деле существует два способа, которыми 9X_csharp итератор может прекратить итерацию. В одном 9X_dot-net случае логика метода могла естественным 9X_dot-net образом выйти из метода после возврата всех 9X_visual-c# элементов. Вот пример:

IEnumerable FindPrimes(uint startAt, uint maxCount)
{
    for (var i = 0UL; i < maxCount; i++)
    {
        startAt = NextPrime(startAt);
        yield return startAt;
    }

    Debug.WriteLine("All the primes were found.");
}

В приведенном выше 9X_.cs-file примере метод итератора естественным образом 9X_c#-language прекращает выполнение после того, как будут 9X_c#.net найдены простые числа maxCount.

Оператор yield break - это еще 9X_.net-framework один способ прекращения перечисления итератором. Это 9X_csharp способ преждевременно выйти из перечня. Вот 9X_c# тот же метод, что и выше. На этот раз у 9X_.cs-file метода есть ограничение на время, в течение 9X_yield которого он может выполняться.

IEnumerable FindPrimes(uint startAt, uint maxCount, int maxMinutes)
{
    var sw = System.Diagnostics.Stopwatch.StartNew();
    for (var i = 0UL; i < maxCount; i++)
    {
        startAt = NextPrime(startAt);
        yield return startAt;

        if (sw.Elapsed.TotalMinutes > maxMinutes)
            yield break;
    }

    Debug.WriteLine("All the primes were found.");
}

Обратите внимание 9X_yield-keyword на вызов yield break. Фактически, он досрочно выходит 9X_c#.net из перечисления.

Также обратите внимание, что 9X_.net-framework yield break работает иначе, чем простой break. В приведенном 9X_.net выше примере yield break выходит из метода, не вызывая 9X_c-sharp Debug.WriteLine(..).

14
0

Ответ #6

Ответ на вопрос: Что значит "уступить перерыв"; делать на C#?

разрыв доходности - это просто способ сказать 9X_c# возврат в последний раз и не возвращать 9X_csharp никакого значения

например

// returns 1,2,3,4,5
IEnumerable CountToFive()
{
    yield return 1;
    yield return 2;
    yield return 3;
    yield return 4;
    yield return 5;
    yield break;
    yield return 6;
    yield return 7;
    yield return 8;
    yield return 9;
 }

14
0

Ответ #7

Ответ на вопрос: Что значит "уступить перерыв"; делать на C#?

Вот очень хороший пример http://www.alteridem.net/2007/08/22/the-yield-statement-in-c/:

public static IEnumerable Range( int min, int max )
{
   while ( true )
   {
      if ( min >= max )
      {
         yield break;
      }
      yield return min++;
   }
}

и пояснение, что 9X_.cs-file если оператор yield break попадает в метод, выполнение 9X_.net-framework этого метода останавливается без возврата. Бывают 9X_c# ситуации, когда вы не хотите давать никакого 9X_yield-keyword результата, тогда вы можете использовать 9X_c#.net разрыв доходности.

8
0