2010-03-27 7 views
9

Könnten Sie mir bitte mitteilen, was die genaue Unterscheidung zwischen verzögerter Ausführung und Lazy-Auswertung in C# ist? Diese beiden werden synonym verwendet.Kann jemand bitte den Unterschied mit einem Beispiel erklären?Unterschied zwischen verzögerter Ausführung und Lazy-Auswertung in C#

+2

Duplizieren, von einem Benutzer mit dem gleichen Namen von http://stackoverflow.com/questions/2515796/2515920 –

+0

Klicken Sie auf Jon Skeets Blogpost zu dem Thema: [http://msmvps.com/blogs/jon_skeet /archive/2010/03/25/just-how-lazy-are-you.aspx](http://msmvps.com/blogs/jon_skeet/archive/2010/03/25/just-how-lazy-are- Sie.aspx) – Jan

+0

In Ordnung, Sie gewinnen. Langsam/faul ich :) – Jan

Antwort

20

In der Praxis bedeuten sie im Wesentlichen das Gleiche. Es ist jedoch vorzuziehen, den Ausdruck deferred zu verwenden.

  • Faule bedeutet „nicht die Arbeit machen, bis Sie absolut zu haben.“

  • Latente bedeutet „das Ergebnis nicht berechnen, bis der Anrufer es tatsächlich nutzt.“

In der Praxis, wenn der Anrufer das Ergebnis einer Auswertung zu verwenden entscheidet (dh beginnt durch ein IEnumerable<T> Iterieren), das ist genau der Punkt, an dem die „Arbeit“ getan werden muss (wie beispielsweise die Ausgabe eine Abfrage an die Datenbank).

Der Begriff zurückgestellt ist genauer/beschreibend, was tatsächlich vor sich geht. Wenn ich sage, dass ich bin faul, bedeutet es, dass ich vermeiden unnötige Arbeit zu vermeiden; es ist mehrdeutig, was das wirklich impliziert. Jedoch, wenn ich sage, dass Ausführung/Auswertung ist aufgeschoben, bedeutet es im Wesentlichen, dass ich Ihnen nicht das echte Ergebnis überhaupt geben, aber eher ein Ticket, das Sie verwenden können, um das Ergebnis Anspruch auf. I defer tatsächlich ausgehen und bekommen das Ergebnis bis Sie Anspruch es.

Bitte verwenden Sie den Begriff zurückgestellt bei der Diskussion des Betreffs, wie es C# betrifft. Lazy ist eine vaguer Version.

Anmerkung: Faul Ausführungs-/Evaluierungs unterscheidet sich von lazy Lade oder in Zusammenhang mit einer Sequenz Abrufen. Lazy loading und eifrig laden sind Begriffe, die verwendet werden, um zu beschreiben, wie Elemente einer Sequenz geladen werden. Wenn eine Sequenz geladen träge ist, bedeutet dies, dass, was auch immer die Sequenz erzeugt, gerade genug funktioniert, um ein Element auf einmal zu laden. Wenn eine Sequenz eifrig geladen ist, wird die gesamte Sequenz auf einmal geladen und in einem lokalen Puffer gespeichert. Unterschiedliche Benutzungsanforderungen erfordern unterschiedliche Lademuster.

+0

Sehr geehrte Aaronaught, Vielen Dank für Ihre ausführliche und hervorragende Erklärung ... –

+0

Wenn jemand einen Code benötigt, um zu sehen, wie diese beiden funktionieren, bereite ich Console App, die Unterschiede zwischen ihnen zeigt: https://github.com/jakubmaguza/Lazy-vs-Deferred-vs-Normal/blob/master/src/Main.cs – titol

Verwandte Themen