Lambda-Ausdrücke sind eine einfachere Syntax für anonyme Delegaten und können überall dort verwendet werden, wo ein anonymer Delegat verwendet werden kann. Das Gegenteil ist jedoch nicht der Fall; Lambda-Ausdrücke können in Ausdrucksbäume konvertiert werden, was viel Magie wie LINQ to SQL ermöglicht.
Das Folgende ist ein Beispiel für einen LINQ to Objects- Ausdruck, bei dem anonyme Delegaten und dann Lambda-Ausdrücke verwendet werden, um zu zeigen, wie viel einfacher für das Auge sie sind:
// anonymous delegate
var evens = Enumerable
.Range(1, 100)
.Where(delegate(int x) { return (x % 2) == 0; })
.ToList();
// lambda expression
var evens = Enumerable
.Range(1, 100)
.Where(x => (x % 2) == 0)
.ToList();
Lambda-Ausdrücke und anonyme Delegaten haben gegenüber dem Schreiben einer separaten Funktion den Vorteil, dass sie Schließungen implementieren, mit denen Sie den lokalen Status an die Funktion übergeben können, ohne der Funktion Parameter hinzuzufügen oder Objekte zur einmaligen Verwendung zu erstellen.
Ausdrucksbäume sind eine sehr leistungsstarke neue Funktion von C # 3.0, mit der eine API die Struktur eines Ausdrucks anzeigen kann, anstatt nur einen Verweis auf eine Methode zu erhalten, die ausgeführt werden kann. Eine API muss lediglich einen Delegatenparameter in einen Expression<T>
Parameter umwandeln, und der Compiler generiert einen Ausdrucksbaum aus einem Lambda anstelle eines anonymen Delegaten:
void Example(Predicate<int> aDelegate);
genannt wie:
Example(x => x > 5);
wird:
void Example(Expression<Predicate<int>> expressionTree);
Letzterem wird eine Darstellung des abstrakten Syntaxbaums übergeben , der den Ausdruck beschreibt x > 5
. LINQ to SQL basiert auf diesem Verhalten, um C # -Ausdrücke in die SQL-Ausdrücke umwandeln zu können, die zum Filtern / Ordnen / usw. auf der Serverseite gewünscht werden.
delegate
in C # ist, empfehle ich dringend, dies zu lesen, bevor Sie den Rest dieser Seite lesen