C# Keywords - Was macht eigentlich "yield"?

Play C# Keywords - Was macht eigentlich "yield"?

The Discussion

  • User profile image
    Stefan

    Ich finde, dass dein Beispiel den Vorteil von yield nicht besonders gut herausarbeitet.
    Die Alternative zu yield ist für mich immer die Verwendung eines Arrays oder einer Liste, die zum Befüllen angelegt wird. An dieser Stelle muss ich auf den aus meiner Sicht einzigen catch von yield achten: die Performanz. Eine Implementation auf Arrays oder Listen ist meistens schneller, und wenn ich bereits eine Collection (mit bekanntem Count) habe ist es unklug diese mit yield in eine IEnumerable umzuwandeln und dabei die Anzahl der Elemente wieder zu vergessen.
    Den Vorteil dem gegenüber sehe ich darin, dass die Absicht, das, was eine Funktion eigentlich zurückgeben soll, mit yield klarer hervortritt, da ich mich nicht um die Verwaltung der Liste kümmern muss.
    Da dein Beispiel die Berechnung der Fibonacci-Zahlen sowieso an ComputeFibo() delegiert, vereinfacht es die Berechnung nicht wirklich. Zumal diese Funktion ab n = 40 ewig braucht ein Ergebnis zu liefern.
    Fibonacci-Zahlen rekursiv zu berechnen wird meist als Beispiel verwendet, wie man es NICHT macht. Bei der Implementierung der iterativen Methode hingegen vereinfacht yield das Ganze erheblich:

    [TestMethod]
    public void TestMethod()
    {
    CollectionAssert.AreEqual(new ulong[] { 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, }, FibonacciNumbers.Take(10).ToArray());
    }

    public IEnumerable<ulong> FibonacciNumbers
    {
    get
    {
    ulong f_nminus1 = 1;
    yield return f_nminus1;

    ulong f_n = 1;
    yield return f_n;

    while (true)
    {
    var f_nplus1 = f_n + f_nminus1;
    yield return f_nplus1;

    f_nminus1 = f_n;
    f_n = f_nplus1;
    }
    }
    }

    Das auf einer Liste zu implementieren wird recht Index-lastig.
    Und schließlich ermöglicht das yield-Schlüsselwort die Lazy-Evaluierung von Enumerations. In dem Fall führt eigentlich nichts an diesem Schlüsselwort vorbei.

Add Your 2 Cents