Что такое делегат простыми словами
Зачем нужны делегаты в C#?
Продумывая архитектуру очередного класса вы понимаете, что вам очень бы пригодилась возможность передать в качестве аргумента кусок исполняемого кода. Это позволило бы вам избежать вереницы if-ов и case-ов и сделало бы ваш код более элегантным Девушки восхищенно бы охали и непременно оставляли бы вам свой телефончик в комментах. Кхм… что-то я увлекся.
Итак как это делается в C#? Например вы пишете калькулятор и у вас есть простейшая логика:
Как говорят мои израильские друзья ма лаасот?
Во первых надо инкапсулировать код в функции:
Во вторых надо вообще избавиться от свитча:
Что мы сделали? Мы вынесли определение операций из кода в данные — из свитча в словарь.
Делегат это обьект указывающий на функцию. Вызывая делегат, мы вызываем функцию на которую он указывает. В данном случае мы создаем делегат на функцию принимающую два double параметра и возращающую double. Во второй строке мы создаем маппинг между символом операции (+-*/) и её функцией.
Таким образом мы разрешили первый недостаток: список операций можно изменять по своему усмотрению.
К сожалению мы поимели лишний делегат, да и запись вида не так понятна как
Начиная с C# 2.0 мы можем разрулить эту проблему внедрением анонимных методов:
Здесь для сложения и вычитания я использую анонимные методы, а для умножения и деления полноценные методы. Но всё равно слишком много воды.
На помощь приходит C# 3.0 с лямбдами:
Во-о-т, уже гораздо лучше — девушки уже строчат комменты!
Итог
Чего же мы добились? Ключевой метод PerformOperation сократился до разумной длины.
Таким образом в C# можно писать изящные, типизированные конструкции практически без лишней воды.
Уголок любителя динамических языков
А вот в JavaScript я всегда мог написать
Нафига спрашивается всякие фанки-шманки?
Отвечаю: C# это сильно-типизированный язык, который строго следит за тем чтобы типы совпадали и не падали в рантайме. За попытку присвоения неправильных типов, он бьет по рукам при компиляции. Поэтому ему требуется формальное указание о всех фигурирующих типах.
Апдейт, где я срываю покровы.
Переписав наш PerformOperation на использование делегатов мы можем расширить функциональность калькулятора. Добавим метод DefineOperation в класс Calculator:
Теперь для наглядности добавим операцию взятия по модулю:
Сделать такой же трюк невозможно без изменения кода калькулятора если PerformOperation использует switch.
Значение слова делегат
Делегат в словаре кроссвордиста
делегат
м.Выборный представитель, уполномоченный коллективом, организацией, государством.
Большой современный толковый словарь русского языка
( лат. delegatus посланный, посланец) выборный или назначенный представитель, уполномоченный государства, организации, коллектива.
Новый словарь иностранных слов
м. Выборный представитель, уполномоченный коллективом, организацией, государством.
Новый толково-словообразовательный словарь русского языка Ефремовой
[выборный или назначенный представитель, уполномоченный государства, организации, коллектива.
Словарь иностранных выражений
Словарь русского языка Лопатина
выборный или назначенный представитель, уполномоченный государством, коллективом Д. конференции.
Словарь русского языка Ожегова
делегат м. Выборный представитель, уполномоченный коллективом, организацией, государством.
Толковый словарь Ефремовой
делегата, м. (латин. delegatus). Выборный представитель, уполномоченный каким-н. коллективом. Делегаты съезда.
Толковый словарь русского языка Ушакова
Однотомный большой юридический словарь
Полный орфографический словарь русского языка
выборный или назначенный представитель какой-либо организации, учреждения, коллектива, участвующий в работе какого-либо собрания, конференции и т. п.
Присутствовало 1349 делегатов с решающим голосом и 81 делегат с совещательным голосом, представлявших 6 795 896 членов партии и 419 609 кандидатов в члены партии.
Среди наших делегатов – плоть от плоти человечества – наверняка найдется тот, кто захватит в дорогу дальнюю пару фантастических покетов (не надо говорить, что будет читать электронные версии – потому как нельзя все же чужакам доверять!) того самого среднестатистического… Конечно, груженный галактическими сувенирами и опасаясь космического перегруза на обратной дороге, делегат оставит уже прочитанные покеты в номере космического отеля.