Meine zwei Cent auf das Yield-Keyword in C #

Das in C # 2.0, T erstmals eingeführte Schlüsselwort yield gibt ein Objekt zurück, das die IEnumerable-Schnittstelle implementiert. Die IEnumerable-Schnittstelle macht einen IEnumerator verfügbar, mit dem eine nicht generische Sammlung mithilfe einer foreach-Schleife in C # iteriert werden kann. Mit dem Schlüsselwort yield können Sie angeben, dass die Methode oder der Get-Accessor, in dem sie verwendet wurde, ein Iterator ist.

Es gibt zwei Möglichkeiten, wie Sie das Schlüsselwortield verwenden können: Verwenden Sie die Anweisungen "Yield Return" und "Yield Break". Die Syntax von beiden ist unten gezeigt.

yield return ;

yield break;

Warum sollte ich das Yield-Schlüsselwort verwenden?

Das Schlüsselwort yield kann eine vollständige Iteration durchführen, ohne dass eine temporäre Sammlung erstellt werden muss. Mit anderen Worten, wenn Sie die Anweisung "Yield Return" in einem Iterator verwenden, müssen Sie vor der Rückgabe keine temporäre Sammlung zum Speichern von Daten erstellen. Sie können die Yield-Return-Anweisung nutzen, um jedes Element in der Auflistung einzeln zurückzugeben, und Sie können die "Yield-Return" -Anweisung mit Iteratoren in einer Methode oder einem get-Accessor verwenden.

Beachten Sie, dass das Steuerelement jedes Mal an den Aufrufer zurückgegeben wird, wenn die Anweisung "Yield Return" angetroffen und ausgeführt wird. Am wichtigsten ist, dass bei jedem solchen Aufruf die Statusinformationen des Angerufenen erhalten bleiben, sodass die Ausführung unmittelbar nach der Yield-Anweisung fortgesetzt werden kann, wenn das Steuerelement zurückkehrt.

Schauen wir uns ein Beispiel an. Das folgende Codeausschnitt zeigt, wie das Schlüsselwort yield verwendet werden kann, um eine Fibonacci-Zahl zurückzugeben. Die Methode akzeptiert eine Ganzzahl als Argument, die die Anzahl der zu generierenden Fibonacci-Zahlen darstellt.

static IEnumerable GenerateFibonacciNumbers(int n)

       {

           for (int i = 0, j = 0, k = 1; i < n; i++)

          {

               yield return j;

               int temp = j + k;

               j = k;

               k = temp;

           }

       }

Wie im obigen Code-Snippet gezeigt, ist die Anweisung "Yield Return j;" Gibt Fibonacci-Zahlen nacheinander zurück, ohne die for-Schleife zu verlassen. Mit anderen Worten, die Zustandsinformationen bleiben erhalten. So kann die GenerateFibonacciNumbers-Methode aufgerufen werden.

foreach (int x in GenerateFibonacciNumbers(10))

   {

       Console.WriteLine(x);

   }

Wie Sie sehen können, müssen Sie keine Zwischenliste oder kein Array erstellen, um die Fibonacci-Nummern aufzunehmen, die generiert und an den Anrufer zurückgegeben werden müssen.

Beachten Sie, dass das Schlüsselwortield unter dem Deckmantel eine Statusmaschine erstellt, um Statusinformationen zu verwalten. In der MSDN heißt es: "Wenn in der Iterator-Methode eine Yield-Return-Anweisung erreicht wird, wird der Ausdruck zurückgegeben und der aktuelle Speicherort im Code beibehalten. Die Ausführung wird an diesem Speicherort beim nächsten Aufruf der Iteratorfunktion neu gestartet."

Ein weiterer Vorteil der Verwendung des Schlüsselwortsield besteht darin, dass die zurückgegebenen Artikel nur bei Bedarf erstellt werden. Der folgende get accessor gibt beispielsweise die geraden Zahlen zwischen 1 und 10 zurück.

public static IEnumerable EvenNumbers

       {

           bekommen

           {

               für (int i = 1; i <= 10; i ++)

               {

                   if ((i% 2) == 0)

                   Rendite Rendite i;

               }}

           }}

       }}

Sie können auf die statische Eigenschaft EvenNumbers zugreifen, um die geraden Zahlen zwischen 1 und 10 im Konsolenfenster mithilfe des unten angegebenen Codeausschnitts anzuzeigen.

foreach (int i in EvenNumbers)

     {

         Console.WriteLine(i);

     }

Sie können die Anweisung "Yield Break" in einem Iterator verwenden, wenn keine weiteren Werte zurückgegeben werden müssen. Die Anweisung "Yield Break" wird verwendet, um die Aufzählung zu beenden.

public IEnumerable GetData(IEnumerable items)

{

   if (null == items)

       yield break;

   foreach (T item in items)

       yield return item;

}

Siehe die obige Codeliste. Beachten Sie, wie überprüft wird, ob der Parameter "items" null ist. Wenn Sie die GetData () -Methode innerhalb eines Iterators und mit null als Parameter aufrufen, kehrt das Steuerelement einfach zum Aufrufer zurück, ohne dass ein Wert zurückgegeben wird.

Punkte, die man sich merken sollte

Beachten Sie bei der Arbeit mit dem Ertragsschlüsselwort die folgenden Punkte:

  • Sie können die Yield-Return-Anweisung nicht in einem Try-Catch-Block haben, obwohl Sie sie in einem Try-finally-Block haben können
  • Sie können die Yield Break-Anweisung nicht in einem finally-Block haben
  • Der Rückgabetyp der Methode, für die Yield verwendet wurde, sollte IEnumerable, IEnumerable, IEnumerator oder IEnumerator sein
  • Sie können keinen ref- oder out-Parameter in Ihrer Methode haben, in dem die Ausbeute verwendet wurde
  • Sie können die Anweisungen "Yield Return" oder "Yield Break" nicht in anonymen Methoden verwenden
  • Sie können die Anweisungen "Yield Return" oder "Yield Break" nicht in "unsicheren" Methoden verwenden, dh Methoden, die mit dem Schlüsselwort "unsafe" gekennzeichnet sind, um einen unsicheren Kontext zu kennzeichnen