Jaka jest różnica między metod anonimowych z C# 2.0 i lambda wyrażenia z C# 3.0.?Jaka jest różnica między metodami anonimowymi (C# 2.0) i wyrażeniami lambda (C# 3.0)?
Odpowiedz
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:
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()); };
- Anonimowych są w zasadzie działa bez nazwy, z możliwością tworzenia zamknięć.
- 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:
- 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:
- Wyrażenia lambda umożliwiają wnioskowanie o parametrach:
- 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 .
- Wyrażenia lambdy pozwalają skrócić listę parametrów tylko do nazwy parametru, gdy typ można wywnioskować, a gdy istnieje tylko jeden parametr
- 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{};
Powinieneś mającą „awesome” odznaki .. – nawfal
„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
@ 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". –