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(..)
.