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