Почему такая шумиха вокруг лямбда-функций C #?

Я начинаю программировать на C # 2.0, поэтому я никогда не использовал лямбда-выражения, но почему так много шума по этому поводу? Это просто синтаксический сахар вокруг анонимных делегатов или есть что-то еще, чего я не вижу?


person raven    schedule 20.07.2009    source источник
comment
Новинка - это сама по себе награда: arstechnica.com/old/content/2008/06/   -  person Greg    schedule 20.07.2009
comment
Да, это дубликат, зачем лямбды спрашивали уже миллион раз. Но я не думаю, что люди вообще серьезно относятся к идее дубликатов.   -  person Daniel Earwicker    schedule 20.07.2009
comment
Да, это дубликат, зачем лямбды спрашивали уже миллион раз. Но я не думаю, что люди вообще серьезно относятся к идее дубликатов.   -  person Steven Sudit    schedule 20.07.2009


Ответы (4)


Что ж, у лямбда-выражений есть две основные особенности по сравнению с анонимными методами:

  • Они более лаконичны, чем анонимные методы
  • Их можно преобразовать в деревья выражений, а также в делегаты.

Однако, если вы не используете деревья выражений, они очень похожи на анонимные методы. Разница в том, что часто вы можете написать несколько лямбда-выражений в одном операторе (объединяя вызовы методов вместе) без потери удобочитаемости, но анонимные методы слишком многословны.

Между прочим, не столько лямбда-выражения - это «просто синтаксический сахар вокруг анонимных делегатов», сколько то, что и лямбда-выражения, и анонимные методы являются «просто синтаксическим сахаром вокруг создания делегатов (и деревьев выражений)».

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

person Jon Skeet    schedule 20.07.2009
comment
JABTW - это мое новое сокращенное обозначение дня, но слишком многословно. Идеально подходит для проверки кода. - person Jeff Yates; 20.07.2009
comment
+1 Мммммм ... деревья выражения. - person Justin Niessner; 20.07.2009
comment
Так используются ли выражения, чтобы агрегаты анонимных методов могли быть свернуты для кода, который по сути работает так же хорошо, как написанные вручную методы? - person Sam Harwell; 20.07.2009
comment
@ 280Z28 - Боюсь, я не понимаю, о чем ты. - person Jon Skeet; 20.07.2009
comment
Спасибо вам всем, ребята. Похоже, мне нужно много прочитать, чтобы понять это. - person raven; 22.07.2009

Их можно легко использовать как синтаксический сахар вокруг делегата, но главное в лямбдах заключается в том, что компилятор имеет возможность превращать их в деревья выражений, которые открывают множество возможностей (не последней из которых является LINQ).

person Andrew Hare    schedule 20.07.2009
comment
Хотя это важная вещь с точки зрения LINQ to SQL и т. Д., Я лично использую тот факт, что они более краткие, чем я использую деревья выражений ... - person Jon Skeet; 20.07.2009
comment
Я тоже - но я думаю, что без деревьев выражений и LINQ команда C # была бы менее склонна добавлять лямбда-выражения в язык только для краткости :) - person Andrew Hare; 20.07.2009

Наличие очень краткого синтаксиса повышает вероятность того, что вокруг них будет построено больше вещей. Представьте себе сложный запрос Linq без какого-либо синтаксического сахара.

person Lou Franco    schedule 20.07.2009
comment
Боюсь, я не использую Linq. Я пока застрял в C # 2.0, поэтому не могу себе этого представить. Спасибо, в любом случае. - person raven; 22.07.2009

Это просто синтаксический сахар вокруг анонимных делегатов или есть что-то еще, чего я не вижу?

Хороший вопрос. Ответ сложен. Во-первых, очевидно, что деревья выражений самые большие. Но есть и тонкости. Вот пять моих многословных и часто отвлекающих статей о том, чем лямбды тонко отличаются от анонимных методов:

http://blogs.msdn.com/ericlippert/archive/2007/01/10/lambda-expressions-vs-anonymous-methods-part-one.aspx

http://blogs.msdn.com/ericlippert/archive/2007/01/11/lambda-expressions-vs-anonymous-methods-part-two.aspx

http://blogs.msdn.com/ericlippert/archive/2007/01/12/lambda-expressions-vs-anonymous-methods-part-three.aspx

http://blogs.msdn.com/ericlippert/archive/2007/03/26/lambda-expressions-vs-anonymous-methods-part-four.aspx

http://blogs.msdn.com/ericlippert/archive/2007/03/28/lambda-expressions-vs-anonymous-methods-part-five.aspx

Все мои статьи по вопросам, связанным с лямбда-выражениями, заархивированы здесь:

http://blogs.msdn.com/ericlippert/archive/tags/Lambda+Expressions/default.aspx

person Eric Lippert    schedule 20.07.2009