| 

.NET C# Java Javascript Exception

7
Welche Vorteile haben eigentlich die neuen Iteratoren zum Durchlaufen und zur eintragsspezifischen Werterückgabe (siehe hier) in .NET 4.5 gegenüber Werten, die beispielsweise Objekten direkt per Eigenschaften zugeordnet sind? Wodurch rechtfertigt sich der erhöhte Kodierungsaufwand? Und wo findet man vielleicht sinnvollere Beispiele?
News:
14.06.2013
VbFan 460 1 8
2 Antworten
6
Mit yield (wurde übrigens mit .NET 2.0 und nicht erst 4.5 eingeführt) kann man viel anstellen, was sonst gar nicht (oder nur sehr schwer) möglich wäre, z.B. Generatoren oder korekursive Algorithmen implementieren.
Auf herkömmlichem Weg alle natürlichen Zahlen zurückzuliefern und davon die ersten 20 zu verwenden, geht schlichtweg nicht. Ich müsste zuerst eine vollständige unendliche Liste erzeugen, um im Anschluss nur die ersten 20 Elemente zu verwenden. Das ist nicht nur unmöglich, sondern auch furchtbar imperformant.
Durch Verwendung von yield und damit der Lazy Evaluation (ein Konzept der funktionalen Programmierung) des Iterators, kann man einen Generator implementieren, der das kann:

public IEnumerable<int> GetNumbers()
{
for(int i = 0; ; i++)
yield return i;
}

// Verwendung:
var first20 = GetNumbers().Take(20);


Desweiteren ist es durch Verwendung von yield überhaupt nicht mehr nötig, überhaupt eine Collection zu verwenden. Durch die Verwendung von yield kann ich auch ohne Zwischenspeicher die nacheinander eintreffenden Antworten eines Webservices als Iterator offenlegen.
Der von Floyd angesprochene Performancevorteil kommt auch noch dazu. Auch wenn uns wahrscheinlich nicht alle Vorteile sofort einfallen, so fällt es mir umgekehrt schwer, einen Nachteil zu identifizieren.
Ich möchte nicht mehr ohne yield arbeiten müssen.
14.06.2013
ffordermaier 8,4k 3 9
Danke für diese Beschreibung... das macht einiges klarer.
VbFan 17.06.2013
1
Für C# gibt es yield zwar schon seit .NET 2.0, aber VB-Fans mußten tatsächlich bis .NET 4.5 warten ;-)
Matthias Hlawatsch 17.06.2013
@Matthias: Danke für die Info, das wußte ich nicht, dass man die VB-Fans so lange warten ließ.
ffordermaier 17.06.2013
5
Falls du yield meinst. Gibt es zwei Punkte die dafür sprechen.
Erstens ist die Codierung einfacher (anstatt selbst eine Liste zu erzeugen erzeugt der Compiler diese automatisch), und zum zweiten die Performance. Yield-Return-Anweisungen werden erst ausgeführt wenn sie benötigt werden. Dh. wenn du eine Schleife mit einer Komplexen Berechnung hast, wird normalerweise erst alle Ergebnisse ausgerechnet und dann zurückgegeben. Bei Yield-Return hingehen wird die Berechnung erst ausgeführt wenn die Rückgabewerte auch abgefragt werden.
14.06.2013
Floyd 14,6k 3 9
Danke für diese Info!
VbFan 17.06.2013

Stelle deine .net-Frage jetzt!