Синтаксический сахар (англ. syntactic sugar) — термин, обозначающий дополнения синтаксиса языка программирования, которые не добавляют новых возможностей, а делают использование языка более удобным для человека.
Анонимные делегаты были и раньше, лямбда просто позволяет их проще использовать
Да, я не C#-разработчик, просто статью прочитал :) Для меня lambda — это как в Lisp, полноценный способ «создать процедуру». А в C# видимо терминология наоборот (по историческим причинам, видимо). Или в C# лямбда-выражения более «урезаны» (например, как в python, разрешено только одно выражение)?
То есть с одной стороны вы написали что больше половины вашего окружения не понимают что есть по сути Замыкания (включая вас самих). А с другой — вы жахнули на Хабр свалку кода не удосужившись ничего внятно пояснить в целом. Зато разбавили его тучей умных слов. Ну… мы поняли как вы умны. :-)
Что такое область видимости переменных скорее всего понимает любой квалифицированный программист. Это верно. А вот что означает термин 'Замыкания' — наверное не любой. Вы же вроде и сами признались в топике, что не имели достаточно понимания? Верно? Почему же тогда вас удивляет моё замечание? :)
Если на пальцах, то замыкание — это (1) код и (2) переменные/значения, которые этот код использует. Это всё можно создавать динамически, обычно, при помощи привязывания функций к области видимости, примерно так:
function gen_function(x) { return function(y) { return x + y; }; }
add5 = gen_function(5);
gen_function возвращает замыкание в виде безымянной функции, связанной с переменной х, которая живёт в области видимости, рождающейся во время вызова gen_function.
Ну. Естественно, замыкание потом, после конструирования, можно выполнить. А вообще use wikipedia.
P.S. Замыкания — это очень распространённый инструмент. Объекты — это тоже своеобразные замыкания, например. Так что, любой программист должен про них знать. Особенно, если учесть, что замыкания — это удобный и мощный инструмент для параллельного программирования.
Переодически вижу похожие конструкции в некоторых статьях. Конешно для общего развития и понимания это хорошо. НО… хоть блог и NET, но по опыту знаю, что многие слова и NET разработчики не знают.
PS К тому же в теории это всегда красиво, но на практике в коде не так часто встречаются конструкции такого рода.
Честно говоря, сам натолкнулся на подсказку Решарпера и заинетересовался. А код, где появилась подсказка, был весьма рабочим, что-то вроде:
foreach(int i in someList) {
someOtherList.ForEach(x=>x.Item=i); // <— здесь появилась подсказка
}
Спасибо за пост, я хотя бы понял, что замыканиями действительно увлекаться не стоит, ибо подобные примеры приводят к тому, что код становится абсолютно непонятным.
ЗЫ: Т.к. я читал лекции по замыканиям, я правильно догадался о 4444, я горд, занёс в блокнотик в качестве теста для соискателей работы :)
Видимо вам не нравится место «+= () =>». Соглашусь, тут немного коряво смотрится, но если вам вдруг нужен делегат типа:
int delegate(int x, int y){ return x + y; }
такая запись будет намного удобнее читаться:
(x, y) => x + y
меньше скобок, меньше лишних слов, а компилятор сам определит, что ему нужно.
Нет, я не про то. Конкретно подразумеваю выражение индусский код — код, написанный неестественным и неочевидным способом осложнённый для понимания. C++, к примеру, спроектирован с принципом избыточного программирования и в этом нет ничего плохого, но помимо этого он имеет кучу вот таких «фишек».
C# создавался для платформы.NET, но всё же его пытались сделать более простым и понятным в использовании. Проблема в том, что от от версии к версии сам язык изменяется и на вопрос автора топика в общем смысле «что будет при исполнении такого кода» иногда придётся уточнять какая из дотнетовских платформ имелась в виду, ведь в них встроены разные компиляторы си шарповского языка.
Некоторые возможности просто отмирают, на них пишут depreciated, другие изменяются. На мой взгляд гораздо важнее сосредоточится на проектировании программ и не использовать трудные для восприятия выражения даже если они допустимы.
Я провел опрос среди своих коллег, и только три человека из десяти смогли ответить правильно, причем только двое точно знали, что происходит и почему. Я, к своему стыду, правильного ответа не знал.
А вот из этого на месте автора я бы сделал вывод — «Теперь я знаю эту фишку, но поскольку подавляющее большинство её не знает, то я не буду её использовать, я не хочу писать индусский код (не путать с избыточным программированием)».
Ну, во-первых, код
p += () => Console.Write(j);
был показан только для примера. Мне нужен был делегат, который использовал замыкания, это первое, что пришло в голову, этакий proof of concept.
Во-вторых, руководствуясь вашим принципом, мне не стоит тогда пользоваться анонимными делегатами, extension-методами, LINQ, даже, наверное, эвентами и собственными прерываниями, потому что многие из моего окружения не знают, к сожалению, как этим правильно пользоваться. Это, кстати, тема для отдельного поста, нужно ли и можно ли пользоваться advanced приемами и инструментами при программировании.
Подскажите, пожалуйста, где можно прочитать про var и про « p += () => Console.Write(j); „, конкретно про =>
До этого момента думал, что делегаты я знаю )
Замыкания в C#