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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
44
0
25 679
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Страница 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()); };
  1. Анонимные методы - это в основном функции без имени с возможностью создания замыканий.
  2. Лямбда-выражения - это конструкции, которые могут быть преобразованы как в анонимные методы, так и в деревья выражений и подчиняются более сложным правилам вывода типов, чем анонимные методы.

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

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

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

public event EventHandler Click = delegate{};

У вас должен быть "крутой" значок ...

nawfal 20.12.2013 18:09

«Лямбда-выражения позволяют сократить список параметров до имени параметра, когда тип может быть выведен и когда есть только один параметр» - Несколько параметров тоже хорошо, не так ли? (x,y) => {}

Basic 14.02.2015 20:15

@Basic: Нет, это имена параметров в скобках. Сравните это с x => x.Length. Ваш пример взят из пункта 2, «Лямбда-выражения позволяют вывод типа по параметрам».

Jon Skeet 14.02.2015 20:16

@JonSkeet Не могли бы вы уточнить пятый пункт?

Richa Garg 03.07.2018 10:11

@RichaGarg при определении анонимного метода, на который указывает переменная делегата, вы можете опустить параметры при определении тела анонимного метода, если эти параметры не были упомянуты в теле анонимного метода. Взгляните на мой фрагмент кода здесь, чтобы получить больше ясности. Сообщение Этот точно развивает этот сценарий. Джон, пожалуйста, поправь меня, если я ошибаюсь.

RBT 03.07.2018 12:02

@RBT: На месте. Спасибо!

Jon Skeet 03.07.2018 13:49

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