Что значит "уступить перерыв"; делать на C#?
Я видел этот синтаксис в MSDN: yield break
, но не знаю, что 9X_yield-keyword он делает. Кто-нибудь знает?
- Возврат доходности устраняет необходимость в списке поддержки, то есть вам не нужно кодировать ч ...
Ответ #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# что мы преждевременно покинули функцию.
- Может ли это быть просто «break» в ...
Ответ #2
Ответ на вопрос: Что значит "уступить перерыв"; делать на C#?
Завершает блок итератора (например, говорит, что 9X_c-sharp в IEnumerable больше нет элементов).
- с [+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; } }
Ответ #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 вручную или завершена.
Ответ #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(..)
.
Ответ #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; }
Ответ #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 разрыв доходности.
-
10
-
2
-
17
-
4
-
4
-
6
-
8
-
4
-
2
-
7
-
2
-
1
-
2
-
2
-
49
-
4
-
7
-
15
-
5
-
6
-
10
-
1
-
3
-
5
-
3
-
3
-
3
-
4
-
6
-
4
-
4
-
4
-
3
-
11
-
10
-
5
-
1
-
5
-
1
-
17
-
5
-
11
-
2
-
4
-
3
-
3
-
1
-
2
-
3
-
2