2008-10-16 20 views

Odpowiedz

27

The MSDN page on anonymous methods explains it

W wersjach C# przed 2,0, jedynym sposób deklarowania delegata było wykorzystanie nazwach metod. C# 2.0 wprowadził anonimowe metody iw C# 3.0 i później, wyrażenia lambda zastępują metody anonimowe jako preferowany sposób do napisania kodu śródliniowego. Jednak informacje o metodach anonimowych w tym artykule dotyczą również wyrażeń lambda . Jest jeden przypadek w , który anonimowy sposób zapewnia funkcjonalność nieznaną w wyrażeniach lambda . Anonimowe metody umożliwiają pominięcie listy parametrów, a oznacza, że ​​anonimową metodę można przekonwertować na delegatów z rozmaitymi sygnaturami . Nie jest to możliwe przy wyrażeniach lambda. W przypadku więcej informacji o wyrażeniach lambda , zobacz Lambda Wyrażenia (przewodnik programowania C#).

And regarding lambda expressions:

Wyrażenie lambda jest anonimowa funkcja, która może zawierać wyrażeń i wypowiedzi, i mogą być wykorzystane do tworzenia delegatów lub rodzajów drzew wyrażenie. Wszystkie wyrażenia lambda używają operatora lambda =>, który jest czytany jako "idzie do". Lewa strona operatora lambda określa parametry wejściowe (jeśli istnieją), a prawa strona blok wyrazu lub instrukcji. Wyrażenie lambda x => x * x jest odczytywane "x idzie do x razy x." To wyrażenie można przypisać do typu delegata w następujący sposób:

10

Po pierwsze, wygoda: lambdy są łatwiejsze do czytania i pisania.

drugie, wyrażenia: lambdas mogą być skompilowane do obu delegata lub drzewko wyrażenie (Expression<T> jakiegoś delegata typu T, takich jak Func<int,bool>). Drzewa wyrażeń są bardziej ekscytujące, ponieważ są kluczem do LINQ do out-of-process przechowywania danych.

Func<int,bool> isEven = i => i % 2 == 0; 
Expression<Func<int,bool>> isEven = i => i % 2 == 0; 

Zauważ, że wyrażenia lambda z organami rachunku mogą być kompilowane tylko do delegatów, nie Expression s: Metody

Action a =() => { Console.WriteLine(obj.ToString()); }; 
21
  1. Anonimowych są w zasadzie działa bez nazwy, z możliwością tworzenia zamknięć.
  2. Wyrażenia lambdy są konstrukcjami, które można przekształcać zarówno w metody anonimowe, jak i drzewa wyrażeń, i postępować zgodnie z bardziej złożonymi regułami wnioskowania typu niż metody anonimowe.

Zakres mniej lub bardziej subtelnych różnic są wyjaśnione przez Eric Lippert (projektant # język C) w swoim blogu:

22
  1. Wyrażenia Lambda można konwertować na delegatów lub drzewa wyrażeń (z pewnymi ograniczeniami); metody anonimowe można konwertować tylko na delegatów:
  2. Wyrażenia lambda umożliwiają wnioskowanie o parametrach:
  3. Wyrażenia lambdy umożliwiają obcięcie treści tylko do wyrażenia (w celu zwrócenia wartości) lub pojedynczego zdania (w innych przypadkach) bez użycia nawiasów klamrowych .
  4. Wyrażenia lambdy pozwalają skrócić listę parametrów tylko do nazwy parametru, gdy typ można wywnioskować, a gdy istnieje tylko jeden parametr
  5. Metody anonimowe pozwalają na całkowite pominięcie listy parametrów, gdy nie jest ona używana w ciele i nie prowadzi to do niejasności.

Ostatni punkt jest jedyną korzyścią anonimowych metod w porównaniu z lambdami, jak sądzę. Jest to przydatne do tworzenia zdarzenia pola jak przy abonamencie no-op jednak:

public event EventHandler Click = delegate{}; 
+1

Powinieneś mającą „awesome” odznaki .. – nawfal

+0

„wyrażenia lambda umożliwić lista parametrów zostać skrócona do tylko nazwa parametru kiedy typ można wywnioskować i gdy jest tylko jeden parametr "- Wiele parametrów też jest w porządku, nie? '(x, y) => {}' – Basic

+1

@ Basic: Nie, to nazwy parametrów * w nawiasach *. Porównaj to z 'x => x.Length'. Twój przykład pochodzi z punktu 2, "Wyrażenia Lambda pozwalają na wnioskowanie o parametrach". –