Делегаты становятся чрезвычайно могущественными, когда вы начинаете рассматривать их как функциональные конструкции
.Net 2.0 включал поддержку анонимных делегатов, которые сформировали ядро некоторых функциональных концепций, которые были расширены Linq. Синтаксис для анонимного делегата несколько громче, чем у Lambda, но в 2.0 есть множество основных функциональных шаблонов.
В универсальном типе List у вас есть следующие элементы, с которыми вы можете работать:
- ConvertAll () - использует делегата для преобразования всех членов списка в другой тип (T). Это в основном реализация функции карты
- Find () и FindAll, оба принимают делегатов и возвращают вам либо один элемент (в случае Find ()), либо все элементы, из-за которых переданный делегат оценивается как true. Это обеспечивает функцию фильтра, а также определение предиката (функция, которая оценивает логическое значение)
- Существует реализация метода ForEach (), который принимает делегат. Позволяет вам выполнить произвольную операцию против каждого элемента в списке.
Appart from List, если вы используете контекст анонимных делегатов правильно, так что вы можете реализовать Closure как структуры. Или, на более практическом уровне, сделайте что-то вроде:
ILog logger = new Logger();
MyItemICareAbout.Changed += delegate(myItem) { logger.Log(myItem.CurrentValue); };
И это просто работает.
Существует также материал DynamicMethod, который позволяет вам определять биты IL (используя Reflection.Emit) и компилировать их как делегаты. Это дает вам хорошую альтернативу чистому отражению для таких вещей, как слои отображения и код доступа к данным.
Делегаты - это действительно конструкция, которая позволяет вам представлять исполняемый код в виде данных. Как только вы поймете, что это значит, можно сделать множество вещей. Поддержка этих конструкций в 2.0 была зачаточной по сравнению с 3.5, но все еще существует и все еще довольно мощна.