Was ist der Unterschied zwischen anonymen Methoden (C # 2.0) und Lambda-Ausdrücke (C # 3.0)? [Duplikat]
-
03-07-2019 - |
Frage
Diese Frage bereits eine Antwort hier:
- delegieren Schlüsselwort vs. Lambda-Notation 6 Antworten
Was ist der Unterschied zwischen anonymen Methoden von C # 2.0 und Lambda-Ausdrücke von C # 3.0. / p>
Lösung
Die MSDN-Seite auf anonyme Methoden erklärt es
In Versionen von C # vor 2.0, die einzigen Art und Weise, einen Delegierten zu erklären, war zu verwenden genannten Methoden. C # 2.0 eingeführt anonyme Methoden und in C # 3.0 und später, Lambda-Ausdrücke ersetzen anonyme Methoden als die bevorzugte Art und Weise Inline-Code zu schreiben. Allerdings ist die Informationen über anonyme Methoden in Dieses Thema gilt auch für Lambda Ausdrücke. Es gibt einen Fall in , die ein anonymes Verfahren liefert Funktionalität nicht in Lambda gefunden Ausdrücke. Anonyme Methoden ermöglichen Sie die Parameterliste weglassen, und Dies bedeutet, dass ein anonymes Verfahren kann mit einem an die Delegierten umgewandelt werden Vielzahl von Unterschriften. Das ist nicht möglich mit Lambda-Ausdrücke. Zum Weitere Informationen speziell zu Lambda-Ausdrücke finden Sie unter Lambda Ausdrücke (C # -Programmierhandbuch).
Und in Bezug auf Lambda-Ausdrücke :
Ein Lambda-Ausdruck ist eine anonyme Funktion, die Ausdrücke und Anweisungen, und kann verwendet werden, erstellen Delegierten oder Ausdrucksbaumarten enthalten. All Lambda-Ausdrücke verwenden, um den Lambda-Operator =>, das gelesen wird, als „geht an“. Die linke Seite des Lambda-Operators gibt die Eingangsparameter (falls vorhanden) und die rechte Seite hält den Ausdruck oder den Anweisungsblock. Der Lambda-Ausdruck x => x * x gelesen "x zu x mal x geht." Dieser Ausdruck kann zu einem Delegattyp wie folgt zugeordnet werden:
Andere Tipps
- Lambda-Ausdrücke können den Delegierten oder Ausdrucksbäume (mit einigen Einschränkungen) umgewandelt werden; anonyme Methoden können nur an die Delegierten umgewandelt werden
- Lambda-Ausdrücke erlaubt Typinferenz auf Parameter:
- Lambda-Ausdrücke erlaubt es dem Körper nur ein Ausdruck abgeschnitten werden (auf einen Wert zurückgeben) oder einzelne Anweisung (in anderen Fällen) ohne Klammern.
- Lambda-Ausdrücke erlaubt der Parameterliste nur der Parameternamen verkürzt werden, wenn der Typ abgeleitet werden kann und wenn es nur ein einzelner Parameter
- Anonyme Methoden ermöglichen die Parameterliste ganz weggelassen werden, wenn es nicht innerhalb des Körpers verwendet wird und es nicht zu einer Zweideutigkeit
Der letzte Punkt der einzige Vorteil der anonymen Methoden über Lambda ist, glaube ich. Es ist nützlich, um eine feldartige Veranstaltung mit einem No-Op-Abonnement zu erstellen, obwohl:
public event EventHandler Click = delegate{};
- Anonyme Methoden sind im Grunde Funktionen ohne Namen, mit der Fähigkeit, Schließungen zu erstellen.
- Lambda-Ausdrücke sind Konstrukte, die sowohl anonyme Methoden und Ausdrucksbäume zu wandelbar sind und komplexere Regeln der Typinferenz als anonyme Methoden folgen.
Die Palette der mehr oder weniger subtile Unterschiede erläutert von Eric Lippert (C # -Sprache Designer) in seinem Blog:
Zuerst Komfort: lambdas sind leichter zu lesen und schreiben
. Zweitens Ausdrücke: lambda kann kompiliert werden entweder ein Delegierter, oder ein Ausdruck Baum (Expression<T>
für einigen Delegierten-Typ T, wie Func<int,bool>
). Expression Bäume sind spannender, als es der Schlüssel zu LINQ to out-of-Process-Datenspeicher ist.
Func<int,bool> isEven = i => i % 2 == 0;
Expression<Func<int,bool>> isEven = i => i % 2 == 0;
, dass die Lambda-Ausdrücke mit Anweisung Körpern Hinweis nur für die Delegierten kompiliert werden, nicht Expression
s:
Action a = () => { Console.WriteLine(obj.ToString()); };