2012-09-04 5 views
10

Während ich mich zu fortgeschritteneren Funktionen von C# vertiefte, stieß ich auf einen Code, von dem ich den Unterschied nicht genau kannte. Es geht um diese beiden Zeilen:Unterschied zwischen Func <> mit Delegat und Lambda-Ausdruck

Func<string, int> giveLength = (text => text.Length); 

und

Func<string, int> giveLength = delegate(string text) { return text.Length; }; 

Dies kann in gleicher Weise verwendet werden:

Console.WriteLine(giveLength("A random string.")); 

Also im Grunde .. Was ist der Unterschied dieser beiden Linien? Und sammeln sich diese Zeilen zur selben CIL?

Antwort

16

Sie sind im Grunde gleich. Sie sind beide anonyme Funktionen in C# Spezifikation Terminologie.

Lambda-Ausdrücke sind im Allgemeinen prägnanter und können auch in expression trees konvertiert werden, die für Out-of-Process LINQ entscheidend sind.

Mit anonymen Methoden können Sie die Parameterliste löschen, wenn Sie nicht interessiert sind. Zum Beispiel:

EventHandler handler = delegate { 
    Console.WriteLine("Sender and args don't matter"); 
}; 

Bedenkt man, wie selten der letzte Punkt ist erforderlich, anonyme Methoden werden immer eine vom Aussterben bedrohte Arten in der modernen C#. Lambda-Ausdrücke sind viel häufiger.

+0

Danke Jon. Übrigens habe ich kürzlich angefangen, dein E-Book 'C# in Depth' zu lesen. Sehr hilfreich! –

+3

@memetolsen: Der Nachteil ist, wenn Sie genug meiner Antworten hier gelesen haben, haben Sie den größten Teil des Inhalts des Buches gelesen;) –

+2

Ich denke, 1/3 meiner Upvotes sind auf Ihre Antworten. Aber trotzdem lese ich lieber das Buch in meiner Freizeit, anstatt 22.284 Antworten zu lesen :) –

6

Also im Grunde .. Was ist der Unterschied dieser beiden Linien? Und sammeln sich diese Zeilen zur selben CIL?

Es gibt nur zwei verschiedene Möglichkeiten, dasselbe zu schreiben. Die Lambda-Syntax ist neuer und prägnanter, aber sie tun dasselbe (in diesem Fall).

Beachten Sie, dass lambdas (=> Syntax) auch verwendet werden kann, um Expression Lambdas zu bilden, wo Sie eine Expression Tree anstelle eines Delegaten machen. Das ist nett, weil Sie die gleiche Syntax verwenden können, egal ob Sie LINQ to Objects (das auf Delegaten wie Func<T, TResult> basiert) oder LINQ to Entities (das IQueryable<T> und Ausdrucksbaumstrukturen verwendet) verwenden.

+0

Danke für Ihre Antwort! –

Verwandte Themen