Что значит "уступить перерыв"; делать на 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