Ausbeute in VB.NET
C# hat das Stichwort genannt Rendite. VB.NET fehlt dieses Schlüsselwort. Wie haben sich die Visual-Basic-Programmierer bekommen, um den Mangel von diesem Schlagwort? Tun Sie, implementieren Sie eigene iterator-Klasse? Oder wollen Sie versuchen, code zu vermeiden, dass ein iterator?
Den Rendite Schlüsselwort zwingt den compiler, einige Codierung zu tun hinter den kulissen. Die Implementierung von Iteratoren in C# und seine Folgen (Teil 1) ist ein gutes Beispiel.
Kommentar zu dem Problem
"VB.NET fehlt dieses Schlüsselwort." - jetzt nicht mehr. Für alle Googler suchen von dieser Seite, schauen Sie sich die Microsoft Async-framework. msdn.microsoft.com/en-us/vstudio/gg316360 und msdn.microsoft.com/en-us/vstudio/gg497937
@mattmc3: beachten Sie, dass erfordert, 2012, und funktioniert nicht in VS.2010
@mattmc3: das Async-framework (dein Erster link) scheint ein schwereres (und komplexere) Lösung als Ertrag (dein zweiter link)? Nicht, dass es darauf ankommt, da die Ausbeute zeigte sich in VB in der gleichen Zeit. Die wollen nur wissen, die ins und outs der verschiedenen Ansätze. msdn.microsoft.com/en-us/magazine/hh456402.aspx beschreibt Async/Await. MIT
erwarten
ist einfach genug. Aber die Umsetzung die andere Seite, aus welchen Quellen der Strom der Objekte, sieht aus wie eine Menge mehr Arbeit, als einfach zu sagen "Ausbeute". FYI, in VS2010 ich war in der Lage, um verwenden von Linq für bestimmte Situationen zu vermeiden, die Schaffung große zwischen Listen.
Where
und Select
. Ex: Dim zsEnum Als IEnumerable(Of Double) = (From p In Punkte, in Denen p.Y > 0 Select p.Z)
, Für Jedes z Als Double In zsEnum ...
. Da Linq schafft ein IEnumerable statt einer konkreten Liste, die oben nicht verbrauchen erhebliche zusätzliche Speicher. Wichtig für die riesige Liste, in 32-bit .Net 3.5 Prozess, um zu vermeiden Zersplitterung der Erinnerung weiter. InformationsquelleAutor der Frage MagicKat | 2008-09-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinweis: Diese Antwort ist jetzt alt. Iterator-Blöcke haben die da Hinzugefügt wurden VB.NET
C# übersetzt das yield-Schlüsselwort in einer state-machine zur compile-Zeit. VB.NET nicht das yield-Schlüsselwort, aber es hat seinen eigenen Mechanismus für die sichere Einbettung Zustand innerhalb einer Funktion, die nicht einfach in C# verfügbar.
C#
static
Schlüsselwort ist normalerweise übersetzt in Visual Basic mit derShared
keyword, aber es gibt zwei Orte, wo die Dinge verwirrend. Einer ist, dass ein C# - statische Klasse ist wirklich ein Modul in Visual Basic ist eher als eine Gemeinsame Klasse (Sie würden denken, dass Sie Sie lassen würde-code entweder in Visual Basic, aber neeeee). Das andere ist, dass VB.NET hat seine eigenenStatic
Schlüsselwort. AllerdingsStatic
hat eine andere Bedeutung in VB.NET.Verwenden Sie die
Static
Schlüsselwort in VB.NET deklarieren Sie eine variable innerhalb einer Funktion, und wenn Sie die variable behält Ihren Zustand über Funktionsaufrufe. Das ist anders als einfach zu deklarieren, private statische Klasse in C#, weil eine statische Funktion Mitglied in VB.NET ist garantiert auch thread-sicher ist, dass der compiler übersetzt zur Verwendung der Monitor-Klasse zur compile-Zeit.Also, warum schreiben alle das hier? Nun, es sollte möglich sein, zu bauen, eine wiederverwendbare generische
Iterator<T>
Klasse (oderIterator(Of T)
im VB.NET). In dieser Klasse würden Sie implementieren der state-machine von C#, mitYield()
undBreak()
Methoden, entsprechen der C# - Schlüsselwörter sind. Dann könntest du eine statische Instanz (in der VB.NET Sinne) in eine Funktion, so dass es letztendlich so ziemlich den gleichen job wie C#'syield
in etwa die gleiche Menge an code (verwerfen der implementations-Klasse selbst, da wäre es unendlich wiederverwendbar).Habe ich nicht gepflegt genug über die Ausbeute an Versuch es selbst, aber es sollte machbar sein. Das heißt, es ist auch keineswegs trivial, da der C# - team-Mitglied Eric Lippert nennt dies "die komplizierteste transformation in den compiler."
Habe ich auch zu der überzeugung gekommen, da schrieb ich den ersten Entwurf dieses vor über einem Jahr, dass es nicht wirklich möglich, in einer sinnvollen Art und Weise, bis Visual Studio 2010 heraus kommt, als würde es verlangen, dass Sie mehrere Lambda-Ausdrücke, um die Iterator-Klasse und so wirklich praktisch ist, wir müssen .NET 4's Unterstützung für mehrzeilige Lambda-Ausdrücke.
InformationsquelleAutor der Antwort Joel Coehoorn
Den Async CTP beinhaltet die Unterstützung für
Yield
im VB.NET.Sehen Iteratoren in Visual Basic für Informationen über den Einsatz.
Und jetzt ist es in der box enthalten, die mit Visual Studio 2012!
InformationsquelleAutor der Antwort CoderDennis
Gibt es den schönen Artikel Verwenden Sie Iteratoren in VB Jetzt von Bill McCarthy, der in der Zeitschrift Visual Studio Magazine auf die Emulation
yield
im VB.NET. Alternativ warten, bis die nächste version von Visual Basic.InformationsquelleAutor der Antwort MarkJ
Ich persönlich Schreibe nur meine eigene iterator-Klasse, die erbt von IEnumerator(Of T). Es dauert irgendwann, es richtig zu machen, aber ich denke, am Ende ist es besser zu schreiben es richtig, dann versuchen, es zu vermeiden. Eine andere Methode, die ich gemacht habe, ist schreiben Sie eine rekursive Methode, die zurückgibt, IEnumerable(Of T) und gibt einfach zurück, List(Of T) verwendet .AddRange.
InformationsquelleAutor der Antwort MagicKat
Glücklicherweise haben wir jetzt
Yield
Gegenzughier ist ein Beispiel aus meinem Projekt + Implementierung einer Schnittstelle mit
System.Collections.Generic.IEnumerable(T)
Funktion:Dies ist, wie extrahiere ich alle Eigenschaften von außen:
InformationsquelleAutor der Antwort jonathana
Ich hoffe, dies wird ein Ding der Vergangenheit mit der kommenden version von VB. Da Iteratoren sind tatsächlich gewinnt eine Menge von Bedeutung mit neuen Paradigmen (vor allem LINQ in Kombination mit lazy evaluation), das hat ganz hohe Priorität, soweit ich weiß, von Paul Vick ' s blog. Dann wieder, Paul ist nicht mehr der Leiter der VB-team und ich habe noch keine Zeit gehabt, zu beobachten, die PCD spricht.
Immer noch, wenn Sie interessiert sind, Sie sind verbunden in Paul ' s blog.
InformationsquelleAutor der Antwort Konrad Rudolph
Den code unten gibt die Ausgabe
2, 4, 8, 16, 32
In VB.NET,
In C#
InformationsquelleAutor der Antwort meenakshisundaram muthukrishna
VB.NET hat die
Iterator
Stichwort https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/modifiers/iteratorSeit Visual Studio 2012 scheint es
InformationsquelleAutor der Antwort Luke T O'Brien