Делегат - класс, в котором хранится функция. В определение делегата входит прототип функций, которые могут быть представлены этим делегатом. При объявлении переменной типа делегата указывается функция, тип которой совместим с типом делегата. После этого делегат можно использовать для вызова указанной функции. Обычно делегаты используются для реализации обратных вызовов. Обратный вызов - вызов из функции A функции B, переданной в качестве параметра функции A. Обратные вызовы часто применяются для передачи из функции информации о производимых ее действиях.
Объявление делегата может располагаться внутри или вне какого-либо класса и похоже на объявление функции, но с добавлением в начале ключевого слова delegate. Для объявления делегата используется следующий синтаксис:
delegate тип делегат(аргументы);
Возможность объявления делегата вне какого-либо класса связана с тем, что на основе строки объявления делегата компилятор фактические генерирует объявление класса, производного от MulticastDelegate.
Для создания делегата необходимо объявить переменную типа делегата и с помощью ключевого слова new вызвать конструктор делегата, передав ему в качестве параметра имя функции, которая будет храниться в делегате.
делегат переменная=new делегат(объект.метод);
Для вызова делегата указывается имя переменной типа делегата, а затем в круглых скобках через запятую перечисляются параметры, которые надо передать функции, вызываемой через объект делегата.
В основе механизма обработки событий лежат делегаты, поэтому прежде, чем объявить событие, необходимо объявить делегат. Объявление события похоже на объявление переменной типа делегата, но с добавлением в начале ключевого слова event. Для объявления события используется следующий синтаксис:
event делегат событие;
Чтобы сгенерировать (возбудить) событие, указывается имя события, а затем в круглых скобках через запятую перечисляются параметры события. Прежде чем возбуждать событие, рекомендуется проверить, не равна ли null переменная, описывающая событие.
Для подписки на событие для какого-либо объекта используется оператор +=, после которого с помощью ключевого слова new вызывается конструктор делегата, в качестве параметра которого указывается имя метода, представляющего из себя обработчик события.
объект.событие+=new делегат(метод);