Heim  >  Artikel  >  Backend-Entwicklung  >  Yield-Schlüsselwort in C#

Yield-Schlüsselwort in C#

王林
王林Original
2024-09-03 15:26:44319Durchsuche

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.

Wie funktioniert Yield Keyword in C#?

  1. Wie funktioniert also das Schlüsselwort Wort in C#? Was ist die interne Implementierung des Schlüsselworts im C#-Compiler? Lasst uns verstehen. Die Methode, die das Schlüsselwort yield enthält, kann von einer Iteratorschleife wie foreach oder einer LINQ-Abfrage verwendet werden. Bei jeder Iteration der Schleife wird die Methode aufgerufen. Der Code in der Methode wird ausgeführt, bis eine Yield-Return- oder Yield-Break-Anweisung auftritt.
  2. Die aktuelle Position der Ausführung in der Methode bleibt erhalten und die nächste Iteration wird dort fortgesetzt, wo sie in der vorherigen Iteration aufgehört hat.
  3. Das war einfach, nicht wahr? Kommen wir zur technischen Umsetzung desselben. Die Methode, die das Schlüsselwort yield enthält, muss immer einen IEnumerable- oder IEnumerator-Wert zurückgeben. Immer wenn der Compiler auf das Schlüsselwort yield stößt, weiß er, dass die Methode von einem Iterator verwendet wird. Wenn die Methode aufgerufen wird, führt der Compiler den Methodenkörper nicht wie üblich aus.
  4. Stattdessen führt es den Methodenkörper aus und gibt einen kompilierten Satz von IEnumerables an die konsumierende Iteratorvariable zurück. Bei jedem Aufruf der Methode sucht der Compiler nach einer yield-Anweisung und hält die Ausführung bei dieser Anweisung an. Die nächste Iteration der Schleife setzt die Ausführung an der zuletzt angehaltenen Stelle fort. Dies dauert bis zur Beendigungsbedingung der Schleife oder einer yield break-Anweisung. Um die Zustandsinformationen nach jeder Iteration zu speichern, erstellt der Compiler eine Zustandsmaschine.

Beispiele für das Yield-Schlüsselwort in C#

Betrachten wir einige Beispiele:

Beispiel #1 – Methode

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;
}
}
}

Yield-Schlüsselwort in C#

Beispiel #2 – Accessor

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; }
}
}

Yield-Schlüsselwort in C#

Beispiel #3 – Ertragsbruch

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;
}
}
}

Yield-Schlüsselwort in C#

Wenn wir elementToFind 1234 ändern, lautet die Ausgabe –

Yield-Schlüsselwort in C#

Regeln

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.

Vorteile

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.

Fazit – Yield-Schlüsselwort in C#

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:C#-Lambda-AusdruckNächster Artikel:C#-Lambda-Ausdruck