Подтвердить что ты не робот

Какая разница между анонимными методами (С# 2.0) и лямбда-выражениями (С# 3.0)?

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

4b9b3361

Ответ 1

Страница MSDN анонимных методов объясняет это

В версиях С# до 2.0, только способ объявить делегата должен был использовать названных методов. Добавлен С# 2.0 анонимные методы и в С# 3.0 и позднее лямбда-выражения заменяют анонимные методы как предпочтительный способ для написания встроенного кода. Однако информация об анонимных методах в эта тема также относится к лямбда выражения. В одном случае который анонимный метод обеспечивает функциональность не найдена в лямбда выражения. Анонимные методы позволяют вы должны опустить список параметров и это означает, что анонимный метод могут быть преобразованы в делегатов с помощью множество подписей. Это не возможно с лямбда-выражениями. Для больше информации о лямбда-выражения, см. Лямбда Выражения (Руководство по программированию на С#).

И в отношении лямбда-выражений:

Лямбда-выражение представляет собой анонимную функцию, которая может содержать выражения и утверждения и может использоваться для создания делегатов или типов дерева выражений. Все лямбда-выражения используют лямбда-оператор = > , который считывается как "идет". Левая часть оператора лямбда указывает входные параметры (если они есть), а правая сторона содержит блок выражения или оператора. Лямбда-выражение x = > x * x читается "x переходит в x раз x". Это выражение можно присвоить типу делегата следующим образом:

Ответ 2

  • Анонимные методы - это в основном функции без имени, с возможностью создания закрытий.
  • Лямбда-выражения - это конструкции, которые можно конвертировать как в анонимные методы, так и в деревья выражений, и следовать более сложным правилам вывода типа, чем анонимные.

Диапазон более или менее тонких различий объясняется Эриком Липпертом (разработчиком языка С#) в его блоге:

Ответ 3

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

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

public event EventHandler Click = delegate{};

Ответ 4

Во-первых, удобство: lambdas легче читать и писать.

Во-вторых, выражения: lambdas могут быть скомпилированы либо делегату, либо дереву выражений (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()); };