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

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

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

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

И в отношении lambda-выражений :

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

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

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

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

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

  • Лямбда-выражения против анонимных методов, часть первая
  • Лямбда-выражения против анонимных методов, часть вторая
  • Лямбда-выражения против анонимных методов, часть третья
  • Лямбда-выражения против анонимных методов, часть четвертая
  • Лямбда-выражения против анонимных методов, часть пятая

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

Во-вторых, выражения: lambdas могут быть скомпилированы либо делегату, либо дереву выражений ( Expression для некоторого типа делегата T, например Func ). Деревья выражений являются более захватывающими, так как это ключ к LINQ для внепроцессных хранилищ данных.

 Func isEven = i => i % 2 == 0; Expression> isEven = i => i % 2 == 0; 

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

 Action a = () => { Console.WriteLine(obj.ToString()); }; 
  • C #: Как создать атрибут метода, запускающего событие при его вызове?
  • Существуют ли какие-либо соглашения по упорядочению методов Java?
  • В Java, как мне вызвать метод базового classа из переопределяющего метода в производном classе?
  • Давайте будем гением компьютера.