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

StackOverflow https://stackoverflow.com/questions/208381

  •  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". Это выражение может быть присвоено типу делегата следующим образом:

Другие советы

  1. Лямбда-выражения могут быть преобразованы в делегаты или деревья выражений (с некоторыми ограничениями);анонимные методы могут быть преобразованы только в делегаты
  2. Лямбда-выражения позволяют определять тип по параметрам:
  3. Лямбда-выражения позволяют усекать тело до простого выражения (для возврата значения) или отдельного оператора (в других случаях) без фигурных скобок.
  4. Лямбда-выражения позволяют сократить список параметров только до имени параметра, когда тип может быть выведен и когда имеется только один параметр
  5. Анонимные методы позволяют полностью исключить список параметров, когда он не используется в теле, и это не приводит к двусмысленности

Я полагаю, что последний пункт - это единственное преимущество анонимных методов перед лямбдами.Однако полезно создать событие, похожее на поле, с подпиской no-op:

public event EventHandler Click = delegate{};
  1. Анонимные методы - это в основном функции без имени, с возможностью создания замыканий.
  2. Лямбда-выражения - это конструкции, которые преобразуются как в анонимные методы, так и в деревья выражений и следуют более сложным правилам вывода типов, чем анонимные методы.

Ряд более или менее тонких различий описан Эриком Липпертом (разработчиком языка 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;

Обратите внимание, что лямбда-выражения с телами операторов могут быть скомпилированы только для делегатов, а не Expressions:

Action a = () => { Console.WriteLine(obj.ToString()); };
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top