Разница между лямбда-выражениями и анонимными методами - С#

Дублировать: делегировать ключевое слово или нотацию lambda

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

Я думаю, я немного смущен, когда использовать что.

Edit: Кроме того, кажется, что для использования анонимных или лямбдов должен существовать метод расширения для типа?

Ответ 1

Выражение лямбда - это просто синтаксис ярлыков для анонимного метода. Анонимные методы выглядят следующим образом:

delegate(params) {method body}

Эквивалентное выражение лямбда будет выглядеть так:

params => method body

Короче говоря, все лямбда-выражения являются анонимными методами, но возможно иметь анонимный метод, который не написан в синтаксисе лямбда (как в первом примере выше). Надеюсь, это будет полезно!

Ответ 2

Лямбда-выражения могут быть преобразованы в деревья выражений, а анонимные делегаты не могут.

Ответ 3

Только выражение лямбда без тела метода может быть преобразовано в дерево выражений

Следующие конструкции do скомпилируют:

            Func<int> exp1 = () => 1;
            Func<int> exp2 = () => { return 1; };
            Func<int> exp3 = delegate { return 1; };
            Expression<Func<int>> exp4 = () => 1;

И следуйте за не

Expression<Func<int>> exp5 = delegate { return 1; }; //no anonymous delegates
Expression<Func<int>> exp6 = () => { return 1; }; //or lambdas with block body

Так что есть разница даже на не очень продвинутом уровне (что Джон Скит указывает здесь пример болезни)

Еще одно отличие состоит в том, что вы можете создавать анонимных делегатов без списка параметров, если вы не планируете использовать их внутри тела метода, при этом lambda всегда должен предоставлять параметры.

Следующие две строки демонстрируют разницу

Func<int, int, int, int, int> anonymous = delegate { return 1; };
Func<int, int, int, int, int> lambda = (param1, param2, param3, param4) => 1;

Вы делаете по существу то же самое, но анонимный делегат явно выглядит лучше здесь.

Ответ 4

На самом деле нет. Это, по сути, одна и та же функция с различными синтаксическими конструкциями. Общий сдвиг, кажется, находится вне синтаксиса анонимного метода С# 2.0 по отношению к синтаксису стиля лямбда для анонимных выражений и функций.