2009-04-17 7 views
10

Duplizieren:delegate keyword vs. lambda notationUnterschied zwischen Lambda-Ausdrücke und anonymen Methoden - C#

verstehe ich die anonymen Methoden verwendet werden können, die Delegierten zu definieren und Inline-Funktionen zu schreiben. Verwendet Lambda Ausdrücke anders als das?

Ich denke, ich bin ein wenig verwirrt wann zu was zu verwenden.

Edit: auch, dass entweder anonym oder Lambda-Ausdrücke verwenden angezeigt wird, muss es eine Erweiterungsmethode für den Typ sein?

Antwort

4

Nicht wirklich nicht. Sie sind im Wesentlichen das exakt gleiche Merkmal mit unterschiedlichen Syntaxkonstrukten. Die allgemeine Verschiebung scheint von der anonymen C# 2.0-Methodensyntax weg zur Lambda-Stil-Syntax für anonyme Ausdrücke und Funktionen zu verlaufen.

15

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

delegate(params) {method body} 

Die äquivalente Lambda-Ausdruck würde wie folgt aussehen:

params => method body 

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

+0

+1, aber sind Lambda-Ausdrücke nicht nur das Rad neu erfinden (eher schlecht, da ich anonyme Methoden sinnvoller gemacht habe). –

+0

so kann Lambada-Ausdruck keine Rückgabewerte haben? während anonyme Methode kann? –

+1

SnOrfus: Ja, sie machen 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. –

6

Lambda-Ausdrücke können zur Expression Bäume umgewandelt werden, während anonyme Teilnehmer nicht.

5

Nur Lambda-Ausdruck ohne Methode Körper kann

Folgende Konstrukte tun Kompilierung Ausdrucksbaum umgewandelt werden:

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

Und folgendes tun nicht

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

So gibt es Unterschied sogar auf nicht sehr fortgeschrittenem Niveau (dass Jon Sk eet weist darauf hin sick difference example)

Ein weiterer Unterschied ist, dass Sie anonyme Delegaten ohne Parameterliste erstellen können, wenn Sie nicht beabsichtigen, sie innerhalb der Methode body verwenden, mit Lambda müssen Sie immer Parameter bereitstellen.

Nach zwei Linien zeigen 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 anonymen Delegaten hier deutlich besser aussieht.

Verwandte Themen