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