Yield ist ein kontextbezogenes Schlüsselwort in C#. Kontextbezogene Schlüsselwörter sind solche Schlüsselwörter in C#, die nicht für das gesamte Programm reserviert sind. Vielmehr handelt es sich um reservierte Schlüsselwörter für bestimmte Teile des Programms, bei denen das Schlüsselwort sinnvoll genutzt werden kann. Diese Schlüsselwörter können als gültige Bezeichner verwendet werden, wenn ihre Relevanz keine besondere Bedeutung für den Compiler vermittelt.
Das Schlüsselwort yield gibt an, dass die Methode oder der Accessor, der das Schlüsselwort enthält, eine Iteratormethode/einen Accessor ist. Eine Iteratormethode/ein Iterator-Accessor ist eine Methode, die keinen einzelnen Wert zurückgibt. Vielmehr wird es in Iterationen aufgerufen und gibt in jeder Iteration unterschiedliche Werte zurück.
Syntax
Die Syntax des Schlüsselworts yield ist ziemlich einfach. Sie müssen lediglich das Schlüsselwort vor der Return-Anweisung der Methode oder des Accessors angeben.
yield return <expression>;
ODER
yield break;
Dies sind die beiden Implementierungen des Schlüsselworts. Bei Verwendung mit einer Return-Anweisung gibt das Schlüsselwort yield den nächsten aus dem Ausdruck berechneten Wert zurück, bis die Exit-Bedingung des Ausdrucks erfüllt ist. Bei Verwendung mit dem Schlüsselwort break unterbricht das Schlüsselwort yield die Iteration und die Programmausführung erfolgt über die Methode/den Accessor.
Betrachten wir einige Beispiele:
Das folgende Beispiel generiert die Fibonacci-Reihe mit dem Schlüsselwort yield.
using System; using System.Collections.Generic; public class Program { public static void Main() { foreach (int ele in GetFibonacciSeries(10)) { Console.Write(ele + "\t"); } } public static IEnumerable<int> GetFibonacciSeries(int x) { for (int a = 0, b = 0, c = 1; a < x; a++) { yield return b; int temp = b + c; b = c; c = temp; } } }
Im folgenden Beispiel wird das Schlüsselwort yield mit einem Get-Accessor verwendet.
using System; using System.Collections.Generic; public class Program { public static void Main() { foreach (Day day in new Days().DaysOfWeek) { Console.WriteLine("Day {0} of the week is {1}", day.DayOfWeek, day.DayName); } } public static IEnumerable<int> Show(int x) { for (int a = 0, b = 0, c = 1; a < x; a++) { yield return b; int temp = b + c; b = c; c = temp; } } public class Days { public IEnumerable<Day> DaysOfWeek { get { yield return new Day{DayName = "Sunday", DayOfWeek = 1}; yield return new Day{DayName = "Monday", DayOfWeek = 2}; yield return new Day{DayName = "Tuesday", DayOfWeek = 3}; yield return new Day{DayName = "Wednesday", DayOfWeek = 4}; yield return new Day{DayName = "Thursday", DayOfWeek = 5}; yield return new Day{DayName = "Friday", DayOfWeek = 6}; yield return new Day{DayName = "Saturday", DayOfWeek = 7}; } } } public class Day { public string DayName { get; set; } public int DayOfWeek { get; set; } } }
Das folgende Beispiel demonstriert die Verwendung der Yield-Break-Anweisung. Die Iteration wird beendet, sobald eine Zahl in der Reihe gefunden wird oder das maximale Suchlimit erreicht ist.
using System; using System.Collections.Generic; public class Program { public static void Main() { int elementToFind = 21; int maxElements = 100; foreach (int ele in FindFibonacciNumber(elementToFind, maxElements)) { Console.Write("Found the number " + elementToFind + " in Fibonacci series."); } } public static IEnumerable<int> FindFibonacciNumber(int n, int max) { for (int a = 0, b = 0, c = 1; true; a++) { if (a > max) { Console.Write("Searched first " + max + " Fibonacci numbers. Element " + n + " not found"); yield break; } if (b == n) { yield return b; yield break; } int temp = b + c; b = c; c = temp; } } }
Wenn wir elementToFind 1234 ändern, lautet die Ausgabe –
1) Jedes Element muss einzeln mit der yield return-Anweisung zurückgegeben werden.
2) Der Rückgabetyp muss ein IEnumerable oder IEnumerator sein.
3) Sie können die Schlüsselwörter „in“, „ref“ und „out“ nicht mit yield verwenden.
4) Das Schlüsselwort „Yield“ kann nicht mit Lambda-Ausdrücken oder anonymen Methoden verwendet werden.
5) Eine yield return-Anweisung darf nicht innerhalb eines Try-Catch-Blocks stehen. Es kann sich innerhalb eines try-finally-Blocks befinden.
6) Eine yield break-Anweisung darf nicht innerhalb eines try-finally-Blocks stehen. Es kann sich innerhalb eines Try-Catch-Blocks befinden.
Das Schlüsselwort yield erspart die Erstellung temporärer Sammlungen. Sie müssen keine temporären Sammlungen erstellen, um die Daten zu speichern, bevor sie von der Methode zurückgegeben werden. Außerdem bleibt der Ausführungsstatus der Methode erhalten und muss daher nicht explizit im Code gespeichert werden.
Aus diesem Artikel haben wir gelernt, dass das Schlüsselwort „how to yield“ ein sehr nützliches Schlüsselwort in C# ist. Es hilft dabei, komplexe Probleme mit möglichst wenigen Zeilen zu codieren und macht den Code außerdem leicht verständlich. Dies war ein Artikel für Fortgeschrittene über die C#-Reise. Es wird empfohlen, das Schlüsselwort in Ihrem Code zu verwenden, damit Sie praktische Übungen erhalten.
Das obige ist der detaillierte Inhalt vonYield-Schlüsselwort in C#. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!