Как стать автором
Обновить

Комментарии 43

Мой первый пост. Не судите строго.
Карма выросла до 12 (спасибо!), но тэги <font> в предпросмотре все равно видны. Это нормально и можно опубликовать с нормальным форматированием?
> лямбда-выражение — это всего лишь «синтаксический сахар» для анонимных методов

А по-моему всё как раз наоборот!
Синтаксический сахар (англ. 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. Замыкания — это очень распространённый инструмент. Объекты — это тоже своеобразные замыкания, например. Так что, любой программист должен про них знать. Особенно, если учесть, что замыкания — это удобный и мощный инструмент для параллельного программирования.
можно ссылку или обьяснить, как замыкания помогают в параллельном программировании?
Насколько я знаю, никак. Распараллеливанию способствует то, что нельзя изменить значение переменной — всегда создаётся новая копия (в ФП).
Ну пост попал на главную страницу, поэтому лемминги вроде меня тоже полезли смотреть :)

Причем все слова в общем-то понятны, но… Я постарался проскроллить до комментов, в надежде, что пойму, о чем это все :)

И вообще, даешь холивар!!! :) PL/SQL рулит!!! :)
Переодически вижу похожие конструкции в некоторых статьях. Конешно для общего развития и понимания это хорошо. НО… хоть блог и NET, но по опыту знаю, что многие слова и NET разработчики не знают.
PS К тому же в теории это всегда красиво, но на практике в коде не так часто встречаются конструкции такого рода.
Честно говоря, сам натолкнулся на подсказку Решарпера и заинетересовался. А код, где появилась подсказка, был весьма рабочим, что-то вроде:
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);
Какой шаблон имеется ввиду? C++ STL|ATL или шаблон проектирования?
Шаблон, который generic. Который генерирует в зависимости от различных параметров различные варианты различных объектов (в широком смысле слова).
А код читается нормально при такой замене (из личного опыта)?
Нормально, если не злоупотреблять.
Каррирование :-)
Угу-угу… Когда в руках молоток, даже собственные ногти могут показаться гвоздями. :-)
Не во всех языках есть generic'и, так что, какое-то нерелевантное это замечание.
Каким шаблонам? Что сказать хотел?
Что хотел, то и сказал.
Ещё раз переспрошу, если непонятно?
Какой шаблон имеется ввиду? C++ STL|ATL или шаблон проектирования?

Вам еще раз и ответим. Шаблоны, которые generic. Ближайший аналог — плюсовые шаблоны, хоть и урезанные

Спасибо за пост, я хотя бы понял, что замыканиями действительно увлекаться не стоит, ибо подобные примеры приводят к тому, что код становится абсолютно непонятным.
ЗЫ: Т.к. я читал лекции по замыканиям, я правильно догадался о 4444, я горд, занёс в блокнотик в качестве теста для соискателей работы :)
Интересно, что побуждает людей писать индийским кодом:
p += () => Console.Write(j);
Видимо вам не нравится место «+= () =>». Соглашусь, тут немного коряво смотрится, но если вам вдруг нужен делегат типа:
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); „, конкретно про =>
До этого момента думал, что делегаты я знаю )
расписать можно примерно так:
p += function() {Console.Write(j)}
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории