10 Stimmen

Unterschied zwischen Lambda-Ausdrücken und anonymen Methoden - C#

Duplikat: Delegate-Schlüsselwort vs. Lambda-Notation

Ich verstehe, dass die anonymen Methoden verwendet werden können, um Delegierte zu definieren und Inline-Funktionen zu schreiben. Ist die Verwendung von Lambda-Ausdrücken anders als diese?

Ich bin wohl ein wenig verwirrt, wann ich was verwenden soll.

Bearbeiten: Auch scheint, dass entweder anonyme oder Lambdas zu verwenden, es muss eine Erweiterung Methode für den Typ sein?

15voto

Adam Alexander Punkte 15082

Ein Lambda-Ausdruck ist einfach eine Abkürzungssyntax für eine anonyme Methode. Anonyme Methoden sehen wie folgt aus:

delegate(params) {method body}

Der entsprechende Lambda-Ausdruck würde wie folgt aussehen:

params => method body

Kurz gesagt, alle Lambda-Ausdrücke sind anonyme Methoden, aber es ist möglich, eine anonyme Methode zu haben, die nicht in Lambda-Syntax geschrieben ist (wie das erste Beispiel oben). Ich hoffe, das war hilfreich!

0 Stimmen

+1, aber erfinden Lambda-Ausdrücke nicht nur das Rad neu (eher schlecht, da ich dachte, dass anonyme Methoden mehr Sinn machen).

0 Stimmen

Lambada-Ausdrücke können also KEINE Rückgabewerte haben, anonyme Methoden hingegen schon?

1 Stimmen

SnOrfus: Ja, sie tun das Gleiche, also hast du Recht, es ist nur eine Frage der Syntaxpräferenz. Sasha: Sowohl Lambdas als auch anonyme Methoden können Rückgabewerte haben.

6voto

bdukes Punkte 144019

Lambda-Ausdrücke können in Ausdrucksbäume konvertiert werden, anonyme Delegierte hingegen nicht.

6voto

Valentin Kuzub Punkte 10967

Nur Lambda-Ausdrücke ohne Methodenkörper können in einen Ausdrucksbaum umgewandelt werden

Folgende Konstrukte tun kompilieren:

            Func<int> exp1 = () => 1;
            Func<int> exp2 = () => { return 1; };
            Func<int> exp3 = delegate { return 1; };
            Expression<Func<int>> exp4 = () => 1;

Und folgendes tun pas

Expression<Func<int>> exp5 = delegate { return 1; }; //no anonymous delegates
Expression<Func<int>> exp6 = () => { return 1; }; //or lambdas with block body

Es gibt also auch auf nicht sehr fortgeschrittenem Niveau Unterschiede (worauf Jon Skeet hier hinweist Beispiel für kranken Unterschied )

Ein weiterer Unterschied ist, dass Sie anonyme Delegierte ohne Parameterliste erstellen können, wenn Sie nicht vorhaben, sie innerhalb des Methodenkörpers zu verwenden, während Sie bei Lambdas immer Parameter angeben müssen.

Die folgenden beiden Zeilen verdeutlichen den Unterschied

Func<int, int, int, int, int> anonymous = delegate { return 1; };
Func<int, int, int, int, int> lambda = (param1, param2, param3, param4) => 1;

Sie tun im Wesentlichen das Gleiche, aber der anonyme Delegierte sieht hier eindeutig besser aus.

4voto

JaredPar Punkte 699699

Nicht wirklich nein. Es handelt sich im Wesentlichen um genau die gleiche Funktion mit unterschiedlichen Syntaxkonstrukten. Die allgemeine Verschiebung scheint weg von der anonymen Methodensyntax von C# 2.0 hin zur Lambda-Syntax sowohl für anonyme Ausdrücke als auch für Funktionen zu gehen.

CodeJaeger.com

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.

Powered by:

X