В чем разница между анонимными методами (C # 2.0) и lambda-выражениями (C # 3.0)?
В чем разница между анонимными методами C # 2.0 и lambda-выражениями C # 3.0.?
- Передача только типа параметра в C #
- Почему этот компилятор кода C ++ (не-void функция не возвращает значение)
- Нельзя ссылаться на не конечную переменную внутри внутреннего classа, определенного другим методом
- Дополнительные методы в интерфейсе Java
- Наследование с нескольких интерфейсов с тем же именем метода
- Напишите метод режима в Java, чтобы найти наиболее часто встречающийся элемент в массиве
- Как проверить, имеет ли объект определенный метод / свойство?
- Методы против конструкторов в Java
Эта страница 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». Это выражение может быть присвоено типу делегата следующим образом:
- Лямбда-выражения могут быть преобразованы в delegates или деревья выражений (с некоторыми ограничениями); анонимные методы могут быть преобразованы только делегатам
- Лямбда-выражения позволяют выводить параметры по параметрам:
- Лямбда-выражения позволяют обрезать тело только для выражения (для возврата значения) или одного оператора (в других случаях) без брекетов.
- Лямбда-выражения позволяют сократить список параметров до имени параметра, когда тип может быть выведен, и когда имеется только один параметр
- Анонимные методы позволяют полностью исключить список параметров, когда он не используется внутри тела, и это не приводит к двусмысленности
Думаю, последний момент – единственное преимущество анонимных методов над lambdaми. Полезно создавать полевое событие с подпиской без участия:
public event EventHandler Click = delegate{};
- Анонимные методы – это в основном функции без имени, с возможностью создания закрытий.
- Лямбда-выражения – это конструкции, которые можно конвертировать как в анонимные методы, так и в деревья выражений, и следовать более сложным правилам вывода типа, чем анонимные.
Диапазон более или менее тонких различий объясняется Эриком Липпертом (разработчиком языка 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()); };