Was ist der Unterschied zwischen anonymen Methoden (C # 2.0) und Lambda-Ausdrücke (C # 3.0)? [Duplikat]

StackOverflow https://stackoverflow.com/questions/208381

  •  03-07-2019
  •  | 
  •  

Frage

    

Diese Frage bereits eine Antwort hier:

         

Was ist der Unterschied zwischen anonymen Methoden von C # 2.0 und Lambda-Ausdrücke von C # 3.0.

War es hilfreich?

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

  1. 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
  2. Lambda-Ausdrücke erlaubt Typinferenz auf Parameter:
  3. 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.
  4. 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
  5. 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{};
  1. Anonyme Methoden sind im Grunde Funktionen ohne Namen, mit der Fähigkeit, Schließungen zu erstellen.
  2. 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 Expressions:

Action a = () => { Console.WriteLine(obj.ToString()); };
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top