600 Stimmen

Was bedeutet "yield break;" in C#?

Ich habe diese Syntax in MSDN gesehen: yield break aber ich weiß nicht, was es bewirkt. Weiß es jemand?

4 Stimmen

Yield return macht eine Backing-Liste überflüssig, d. h. Sie müssen nicht so etwas codieren wie MyList.Add(...) einfach tun yield return ... . Wenn Sie die Schleife vorzeitig verlassen und die virtuelle Backing-Liste zurückgeben müssen, verwenden Sie yield break;

16voto

Wallace Kelly Punkte 13549

El yield break Anweisung wird die Aufzählung gestoppt. In der Tat, yield break schließt die Aufzählung ab, ohne weitere Elemente zurückzugeben.

Es gibt eigentlich zwei Möglichkeiten, wie eine Iterator-Methode die Iteration beenden kann. In einem Fall könnte die Logik der Methode die Methode natürlich beenden, nachdem alle Elemente zurückgegeben wurden. Hier ist ein Beispiel:

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.");
}

Im obigen Beispiel wird die Iterator-Methode natürlich aufhören, ausgeführt zu werden, sobald maxCount Primzahlen gefunden worden sind.

El yield break Anweisung ist eine weitere Möglichkeit für den Iterator, die Aufzählung zu beenden. Es ist eine Möglichkeit, die Aufzählung frühzeitig zu beenden. Hier ist die gleiche Methode wie oben. Diesmal hat die Methode eine Begrenzung der Zeit, die sie ausführen kann.

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.");
}

Beachten Sie die Aufforderung an yield break . Damit wird die Aufzählung vorzeitig beendet.

Beachten Sie auch, dass die yield break funktioniert anders als ein einfaches break . Im obigen Beispiel, yield break verlässt die Methode ohne den Aufruf von Debug.WriteLine(..) .

8voto

Aquí http://www.alteridem.net/2007/08/22/the-yield-statement-in-c/ ist ein sehr gutes Beispiel:

public static IEnumerable<int> Range( int min, int max )
{
   while ( true )
   {
      if ( min >= max )
      {
         yield break;
      }
      yield return min++;
   }
}

und Erklärung, dass, wenn ein yield break Anweisung innerhalb einer Methode getroffen wird, stoppt die Ausführung dieser Methode ohne Rückkehr. Es gibt einige Situationen, in denen Sie kein Ergebnis ausgeben möchten, dann können Sie yield break verwenden.

-4voto

Eranga Dissanayaka Punkte 1932

Das Schlüsselwort yield wird zusammen mit dem Schlüsselwort return verwendet, um dem Enumerator-Objekt einen Wert zu geben. Ertragsrendite gibt den Wert oder die Werte an, die zurückgegeben werden. Wenn die yield return-Anweisung erreicht ist, wird die aktuelle Position gespeichert. Beim nächsten Aufruf des Iterators wird die Ausführung an dieser Stelle wieder aufgenommen.

Die Bedeutung anhand eines Beispiels zu erklären:

    public IEnumerable<int> SampleNumbers()
    {
        int counter = 0;
        yield return counter;

        counter = counter + 2;

        yield return counter;

        counter = counter + 3;

        yield return counter ;
    }

Die bei der Iteration zurückgegebenen Werte sind: 0, 2, 5.

Es ist wichtig zu beachten, dass Zähler Variable in diesem Beispiel ist eine lokale Variable. Nach der zweiten Iteration, die den Wert 2 ergibt, beginnt die dritte Iteration dort, wo sie vorher aufgehört hat, wobei der vorherige Wert der lokalen Variablen namens Zähler der 2. war.

11 Stimmen

Sie haben nicht erklärt, was yield break tut

0 Stimmen

Ich glaube nicht, dass yield return unterstützt tatsächlich die Rückgabe mehrerer Werte. Vielleicht ist das nicht das, was Sie wirklich gemeint haben, aber so habe ich es verstanden.

0 Stimmen

Sam - die SampleNumbers-Methode mit mehreren yield return-Anweisungen funktioniert tatsächlich, der Wert des Iterators wird sofort zurückgegeben und die Ausführung wird fortgesetzt, wenn der nächste Wert angefordert wird. Ich habe schon Leute gesehen, die eine solche Methode mit "yield break" beendet haben, aber das ist unnötig. Wenn man das Ende der Methode drückt, wird auch der Iterator beendet

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X