Ich habe diese Syntax in MSDN gesehen: yield break
aber ich weiß nicht, was es bewirkt. Weiß es jemand?
Sie haben nicht erklärt, was yield break
tut
Ich habe diese Syntax in MSDN gesehen: yield break
aber ich weiß nicht, was es bewirkt. Weiß es jemand?
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(..)
.
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.
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.
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.
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 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.
4 Stimmen
Yield return macht eine Backing-Liste überflüssig, d. h. Sie müssen nicht so etwas codieren wie
MyList.Add(...)
einfach tunyield return ...
. Wenn Sie die Schleife vorzeitig verlassen und die virtuelle Backing-Liste zurückgeben müssen, verwenden Sieyield break;