В чем разница между анонимными методами (C # 2.0) и лямбда-выражениями (C # 3.0)?[дубликат]
-
03-07-2019 - |
Вопрос
На этот вопрос уже есть ответ здесь:
В чем разница между анонимные методы из C # 2.0 и лямбда - выражения из C # 3.0.?
Решение
Это объясняется на странице MSDN, посвященной анонимным методам
В версиях C # до версии 2.0 единственным способом объявить делегат было использование именованных методов.В C # 2.0 появились анонимные методы, а в C # 3.0 и более поздних версиях лямбда-выражения заменяют анонимные методы как предпочтительный способ написания встроенного кода.Однако информация об анонимных методах в этом разделе также применима к лямбда выражениям.Существует один случай, в котором анонимный метод предоставляет функциональность, не найденную в лямбда выражениях.Анонимные методы позволяют опустить список параметров, и это означает, что анонимный метод может быть преобразован в делегаты с различными подписями.Это не можно с лямбда-выражениями.Для получения дополнительной информации конкретно о лямбда-выражениях см. раздел Лямбда Выражения (Руководство по программированию на C#).
И что касается лямбда-выражений:
Лямбда-выражение - это анонимная функция, которая может содержать выражения и инструкции и может использоваться для создания делегатов или типов дерева выражений.Все лямбда-выражения используют лямбда-оператор =>, который читается как "переходит в".Левая сторона лямбда-оператора задает входные параметры (если таковые имеются), а правая сторона содержит выражение или блок оператора.Лямбда-выражение x => x * x читается как "x переходит в x раз x". Это выражение может быть присвоено типу делегата следующим образом:
Другие советы
- Лямбда-выражения могут быть преобразованы в делегаты или деревья выражений (с некоторыми ограничениями);анонимные методы могут быть преобразованы только в делегаты
- Лямбда-выражения позволяют определять тип по параметрам:
- Лямбда-выражения позволяют усекать тело до простого выражения (для возврата значения) или отдельного оператора (в других случаях) без фигурных скобок.
- Лямбда-выражения позволяют сократить список параметров только до имени параметра, когда тип может быть выведен и когда имеется только один параметр
- Анонимные методы позволяют полностью исключить список параметров, когда он не используется в теле, и это не приводит к двусмысленности
Я полагаю, что последний пункт - это единственное преимущество анонимных методов перед лямбдами.Однако полезно создать событие, похожее на поле, с подпиской no-op:
public event EventHandler Click = delegate{};
- Анонимные методы - это в основном функции без имени, с возможностью создания замыканий.
- Лямбда-выражения - это конструкции, которые преобразуются как в анонимные методы, так и в деревья выражений и следуют более сложным правилам вывода типов, чем анонимные методы.
Ряд более или менее тонких различий описан Эриком Липпертом (разработчиком языка C #) в его блоге:
Во-первых, удобство:лямбды легче читать и писать.
Во-вторых, выражения:лямбды могут быть скомпилированы в либо делегат, или дерево выражений (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
s:
Action a = () => { Console.WriteLine(obj.ToString()); };