yield break
Утверждение вызывает перечисление для остановки. По сути, yield break
завершает перечисление без возврата каких-либо дополнительных элементов.
Учтите, что на самом деле метод итератора может прекратить итерации двумя способами. В одном случае логика метода могла естественным образом выйти из метода после возврата всех элементов. Вот пример:
IEnumerable<uint> 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.");
}
В приведенном выше примере метод итератора естественным образом прекратит выполнение, как maxCount
только будут найдены простые числа.
Это yield break
утверждение - еще один способ для итератора прекратить перечисление. Это способ вырваться из списка рано. Здесь тот же метод, что и выше. На этот раз метод имеет ограничение на количество времени, которое метод может выполнить.
IEnumerable<uint> 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.");
}
Обратите внимание на звонок yield break
. По сути, он рано выходит из списка.
Также обратите внимание, что все yield break
работает иначе, чем просто break
. В приведенном выше примере, yield break
выход из метода без вызова Debug.WriteLine(..)
.