В чем разница между анонимные методы в C# 2.0 и лямбда-выражения в C# 3.0?





Страница MSDN об анонимных методах объясняет это
In versions of C# before 2.0, the only way to declare a delegate was to use named methods. C# 2.0 introduced anonymous methods and in C# 3.0 and later, lambda expressions supersede anonymous methods as the preferred way to write inline code. However, the information about anonymous methods in this topic also applies to lambda expressions. There is one case in which an anonymous method provides functionality not found in lambda expressions. Anonymous methods enable you to omit the parameter list, and this means that an anonymous method can be converted to delegates with a variety of signatures. This is not possible with lambda expressions. For more information specifically about lambda expressions, see Lambda Expressions (C# Programming Guide).
А что касается лямбда-выражений:
A lambda expression is an anonymous function that can contain expressions and statements, and can be used to create delegates or expression tree types. All lambda expressions use the lambda operator =>, which is read as "goes to". The left side of the lambda operator specifies the input parameters (if any) and the right side holds the expression or statement block. The lambda expression x => x * x is read "x goes to x times x." This expression can be assigned to a delegate type as follows:
Во-первых, удобство: лямбды легче читать и писать.
Во-вторых, выражения: лямбда-выражения могут быть скомпилированы в либо делегата, или же - в дерево выражений (Expression<T> для некоторых типов делегатов T, таких как Func<int,bool>). Деревья выражений более интересны, так как это ключ к LINQ для внепроцессных хранилищ данных.
Func<int,bool> isEven = i => i % 2 == 0;
Expression<Func<int,bool>> isEven = i => i % 2 == 0;
Обратите внимание, что лямбда-выражения с телами операторов могут быть скомпилированы только для делегатов, но не для Expression:
Action a = () => { Console.WriteLine(obj.ToString()); };
Ряд более или менее тонких различий объясняет Эрик Липперт (разработчик языка C#) в своем блоге:
Я считаю, что последний пункт - единственное преимущество анонимных методов перед лямбдами. Тем не менее, полезно создать событие, похожее на поле, с подпиской без операций:
public event EventHandler Click = delegate{};
«Лямбда-выражения позволяют сократить список параметров до имени параметра, когда тип может быть выведен и когда есть только один параметр» - Несколько параметров тоже хорошо, не так ли? (x,y) => {}
@Basic: Нет, это имена параметров в скобках. Сравните это с x => x.Length. Ваш пример взят из пункта 2, «Лямбда-выражения позволяют вывод типа по параметрам».
@JonSkeet Не могли бы вы уточнить пятый пункт?
@RichaGarg при определении анонимного метода, на который указывает переменная делегата, вы можете опустить параметры при определении тела анонимного метода, если эти параметры не были упомянуты в теле анонимного метода. Взгляните на мой фрагмент кода здесь, чтобы получить больше ясности. Сообщение Этот точно развивает этот сценарий. Джон, пожалуйста, поправь меня, если я ошибаюсь.
@RBT: На месте. Спасибо!
У вас должен быть "крутой" значок ...