yield break und vorzeitige Beendigung
Beenden Sie die Iteration bedingt.
yield break und vorzeitige Beendigung ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Einen Iterator vorzeitig beenden
Manchmal soll ein Iterator die Ausgabe von Werten beenden, bevor das natürliche Ende erreicht ist. Die Anweisung yield break beendet die Sequenz sofort, ähnlich wie ein return bei Iteratoren.
Grundlagen von yield break
yield break beendet den Iterator. Es werden keine weiteren Werte erzeugt, und die ihn konsumierende foreach-Schleife endet.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> UpToFive()
{
for (int i = 1; i <= 100; i++)
{
if (i > 5) yield break;
yield return i;
}
}
public static void Main()
{
foreach (var n in UpToFive())
Console.WriteLine(n);
}
}Solange eine Bedingung erfüllt ist
Ein häufiges Muster besteht darin, nur so lange Elemente auszugeben, wie eine Bedingung wahr ist, und anschließend zu stoppen. Mit yield break lässt sich das übersichtlich umsetzen.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> WhileSmall(IEnumerable<int> nums)
{
foreach (var n in nums)
{
if (n >= 10) yield break;
yield return n;
}
}
public static void Main()
{
foreach (var n in WhileSmall(new[] { 2, 4, 8, 12, 3 }))
Console.WriteLine(n);
}
}Guard Clauses mit yield break
Sie können yield break am Anfang eines Iterators als Guard verwenden. Wenn die Eingabe leer oder ungültig ist, werden überhaupt keine Elemente zurückgegeben.
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
static IEnumerable<string> Lines(string text)
{
if (string.IsNullOrEmpty(text)) yield break;
foreach (var line in text.Split('\n'))
yield return line;
}
public static void Main()
{
foreach (var l in Lines("a\nb\nc"))
Console.WriteLine(l);
Console.WriteLine("empty count: " + Lines("").Count());
}
}Die Anzahl der Ausgaben begrenzen
Verwenden Sie einen Zähler zusammen mit yield break, um die Anzahl der von einem Iterator erzeugten Elemente zu begrenzen – auch bei einer langen Quelle.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> Take(IEnumerable<int> source, int max)
{
int count = 0;
foreach (var item in source)
{
if (count++ >= max) yield break;
yield return item;
}
}
public static void Main()
{
foreach (var n in Take(new[] { 1, 2, 3, 4, 5 }, 3))
Console.WriteLine(n);
}
}break der aufrufenden Person vs. yield break
Eine Sequenz kann auf zwei Arten enden. Die aufrufende Person kann mit break aufhören, weitere Werte abzurufen, oder der Iterator kann mit yield break die Ausgabe beenden. Beides beendet die Schleife, aber aus unterschiedlichen Gründen.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> Counting()
{
int i = 1;
while (true) yield return i++;
}
public static void Main()
{
// Caller decides to stop with break
foreach (var n in Counting())
{
if (n > 3) break;
Console.WriteLine(n);
}
}
}yield break beendet nur den aktuellen Iterator
yield break beendet die Iteratormethode, in der es steht, nicht etwa eine äußere Schleife in der aufrufenden Methode. Die Steuerung kehrt zu dem Code zurück, der die Sequenz durchlaufen hat.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> Bounded(IEnumerable<int> nums, int limit)
{
foreach (var n in nums)
{
if (n > limit) yield break; // ends Bounded only
yield return n;
}
}
public static void Main()
{
var result = Bounded(new[] { 1, 2, 9, 3 }, 5);
Console.WriteLine("iterator created, still running");
foreach (var n in result) Console.WriteLine(n);
}
}Kein yield return nach yield break
Sobald yield break ausgeführt wird, ist der Iterator beendet. Code, der im selben Ausführungspfad physisch danach steht, kann keine Werte mehr erzeugen.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> Demo(bool stopEarly)
{
yield return 1;
if (stopEarly) yield break;
yield return 2;
yield return 3;
}
public static void Main()
{
Console.WriteLine("stopEarly = true:");
foreach (var n in Demo(true)) Console.WriteLine(n);
Console.WriteLine("stopEarly = false:");
foreach (var n in Demo(false)) Console.WriteLine(n);
}
}Filtern und vorzeitiges Beenden kombinieren
Sie können in demselben Iterator filtern und die Ausgabe beenden: Einige Werte überspringen, andere ausgeben und die Verarbeitung vollständig abbrechen, sobald ein Sentinel-Wert auftritt.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> UntilZero(IEnumerable<int> nums)
{
foreach (var n in nums)
{
if (n == 0) yield break; // stop at sentinel
if (n < 0) continue; // skip negatives
yield return n;
}
}
public static void Main()
{
foreach (var n in UntilZero(new[] { 3, -1, 5, 0, 9 }))
Console.WriteLine(n);
}
}yield break und finally-Blöcke
Wenn Ihr Iterator einen try/finally-Block enthält, wird finally weiterhin ausgeführt, wenn yield break die Sequenz beendet. Dadurch wird die Bereinigung, etwa das Schließen von Ressourcen, sichergestellt.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> WithCleanup()
{
try
{
yield return 1;
yield break;
}
finally
{
Console.WriteLine("cleanup ran");
}
}
public static void Main()
{
foreach (var n in WithCleanup())
Console.WriteLine(n);
}
}Probieren Sie es selbst aus
Kombinieren Sie Filterung und vorzeitiges Beenden: Geben Sie positive Zahlen mit yield zurück, aber beenden Sie die Verarbeitung vollständig, sobald ihre laufende Summe ein Budget überschreitet.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> WithinBudget(IEnumerable<int> nums, int budget)
{
int spent = 0;
foreach (var n in nums)
{
if (n <= 0) continue;
if (spent + n > budget) yield break;
spent += n;
yield return n;
}
}
public static void Main()
{
foreach (var n in WithinBudget(new[] { 3, -2, 4, 5, 1 }, 10))
Console.WriteLine(n);
}
}Kurztest
Rufen Sie sich die Funktion von yield break in Erinnerung.
Zusammenfassung
yield break beendet einen Iterator vorzeitig.
- Es funktioniert bei Iteratoren wie ein wertloses
return. - Verwenden Sie es für Take-While-Logik, Schutzbedingungen und Anzahlbegrenzungen.
- Es beendet nur den Iterator, nicht die aufrufende Schleife.
finally-Blöcke werden weiterhin ausgeführt und stellen die Bereinigung sicher.
Häufig gestellte Fragen
Ist die Lektion „yield break und vorzeitige Beendigung“ kostenlos?
Ja — der vollständige Text von „yield break und vorzeitige Beendigung“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „yield break und vorzeitige Beendigung“?
Beenden Sie die Iteration bedingt. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C# Academy zu starten?
Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „yield break und vorzeitige Beendigung“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?
Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Iterator-Methoden mit yield return
- yield break und vorzeitige Beendigung
- Semantik der verzögerten Auswertung
- Benutzerdefinierte Enumerables