Класс, структура, интерфейс, перечисление, делегат – это всё разнообразные категории классов. Каждая категория имеет свои особенности объявления, своё назначение и строго определённую область применения.
Делегат – это тоже класс.
Объявление класса делегата начинается ключевым словом delegate и выглядит следующим образом:
ОбъявлениеКлассаДелегата ::=
[СпецификаторДоступа]
delegate
СпецификаторВозвращаемогоЗначения
ИмяКлассаДелегата
(СписокПараметров);
При этом
СпецификаторВозвращаемогоЗначения ::= ИмяТипа
ИмяКлассаДелегата ::= Идентификатор
а синтаксис элемента СписокПараметров аналогичен списку параметров функции. Но сначала примеры объявления классов делегатов.
delegate int ClassDelegate(int key);
delegate void XXX(int intKey, float fKey);
Подобие объявления класса делегата и заголовка функции не случайно.
Класс делегат способен порождать объекты. При этом назначение объекта-представителя класса-делегата заключается в представлении методов (функций-членов) РАЗЛИЧНЫХ классов.
Тех классов, которые оказываются видимыми из пространства имён, содержащих объявление данного класса-делегата. Объект этого класса способен представлять ЛЮБЫЕ (статические и нестатические) функции-члены классов, лишь бы спецификация их возвращаемого значения и список параметров соответствовали бы характеристикам данного класса-делегата.
В основе любой класс-делегат является многоадресным (multicast delegate). Это означает, что в ходе выполнения приложения делегат способен запоминать ссылки на произвольное количество функций-членов. Эта многоадресность обеспечивается внутренним списком, в который и заносятся ссылки на разнообразные функции-члены, соответствующие заданной сигнатуре и спецификации возвращаемого значения.
Класс-делегат является производным от System.MulticastDelegate, что и позволяет объектам-представителям этого класса реализовывать достаточно сложные алгоритмы настройки на функции-члены различных классов.
Унаследованные свойства и методы классов-делегатов.
Свойства и методы
Назначение
Method
Свойство. Возвращает имя метода, на который указывает делегат.
Target
Свойство. Возвращает имя класса, если делегат указывает на нестатический метод класса. Возвращает значение типа null, если делегат указывает на статический метод.
Функция и операторные функции. Обеспечивают реализацию многоадресного делегата. Работа с операторными функциями смотрится как прибавление и вычитание ДЕЛЕГАТОВ. Арифметика делегатов.
GetInvocationList()
Основываясь на внутреннем списке ссылок на функции, строится соответствующий массив описателей типов функций. Попытка применения метода к пустому делегату приводит к возникновению исключения.
object DynamicInvoke (object[] args)
В соответствии со списком ссылок обеспечивается выполнение функций, на которые был настроен делегат.
static Remove()
Статический метод, обеспечивающий удаление элементов внутреннего списка ссылок на функции.
Пример использования возможностей делегата представлен ниже.
using System;
namespace Delegates_1
{
// Класс делегат. Его объявление соответствует типу функции,
// возвращающей значение int с одним параметром типа int.
delegate int xDelegate(int key);
//===========================================
class ASD
{
// Делегат как член класса.
public xDelegate d;
// А вот свойство, которое возвращает ссылку на делегат.