Я начинаю программировать на C # 2.0, поэтому я никогда не использовал лямбда-выражения, но почему так много шума по этому поводу? Это просто синтаксический сахар вокруг анонимных делегатов или есть что-то еще, чего я не вижу?
Почему такая шумиха вокруг лямбда-функций C #?
Ответы (4)
Что ж, у лямбда-выражений есть две основные особенности по сравнению с анонимными методами:
- Они более лаконичны, чем анонимные методы
- Их можно преобразовать в деревья выражений, а также в делегаты.
Однако, если вы не используете деревья выражений, они очень похожи на анонимные методы. Разница в том, что часто вы можете написать несколько лямбда-выражений в одном операторе (объединяя вызовы методов вместе) без потери удобочитаемости, но анонимные методы слишком многословны.
Между прочим, не столько лямбда-выражения - это «просто синтаксический сахар вокруг анонимных делегатов», сколько то, что и лямбда-выражения, и анонимные методы являются «просто синтаксическим сахаром вокруг создания делегатов (и деревьев выражений)».
Не сбрасывайте со счетов синтаксический сахар - преимущества анонимных функций, действующих как замыкания, огромны, наряду с возможностью иметь код именно там, где вы хотите, а не в отдельном методе.
Их можно легко использовать как синтаксический сахар вокруг делегата, но главное в лямбдах заключается в том, что компилятор имеет возможность превращать их в деревья выражений, которые открывают множество возможностей (не последней из которых является LINQ).
Наличие очень краткого синтаксиса повышает вероятность того, что вокруг них будет построено больше вещей. Представьте себе сложный запрос Linq без какого-либо синтаксического сахара.
Это просто синтаксический сахар вокруг анонимных делегатов или есть что-то еще, чего я не вижу?
Хороший вопрос. Ответ сложен. Во-первых, очевидно, что деревья выражений самые большие. Но есть и тонкости. Вот пять моих многословных и часто отвлекающих статей о том, чем лямбды тонко отличаются от анонимных методов:
Все мои статьи по вопросам, связанным с лямбда-выражениями, заархивированы здесь:
http://blogs.msdn.com/ericlippert/archive/tags/Lambda+Expressions/default.aspx