Общие сведения о делегатах и событиях в C#
Делегаты предоставляют механизм позднего связывания в .NET. Позднее связывание означает, что создается алгоритм, где вызывающий объект также предоставляет по крайней мере один метод, который реализует часть алгоритма.
Например, рассмотрим сортировку списка звезд в астрономическом приложении. Можно отсортировать звезды по расстоянию от Земли, по величине или по воспринимаемой яркости.
Во всех этих случаях метод Sort() выполняет, по сути, одно и то же: упорядочивает элементы в списке на основе некоего сравнения. Для каждого порядка сортировки используется разный код, сравнивающий две звезды.
Такого рода решения использовались в программном обеспечении в течение полувека. Концепция использования делегатов в языке C# обеспечивает первоклассную поддержку языка и безопасность типов.
Как вы увидите далее в этой серии, код C#, который вы пишете для алгоритмов, таких как этот тип, является безопасным. Компилятор гарантирует, что типы соответствуют аргументам и возвращаемым типам.
Указатели функций поддерживают аналогичные сценарии, где требуется больше контроля над соглашением о вызовах. Код, связанный с делегатом, вызывается с помощью виртуального метода, добавленного к типу делегата. Используя указатели функций, можно указать другие соглашения.
Цели разработки языка для делегатов
Разработчики, использующие язык, определили несколько целей для функций, которые в итоге стали делегатами.
Группе разработчиков требовалась общая языковая конструкция, которую можно было бы использовать для любых алгоритмов позднего связывания. Делегаты позволяют разработчикам изучить одну концепцию и применять ее для решения множества различных задач программного обеспечения.
Во-вторых, команде нужна поддержка одиночных и многоадресных вызовов методов. (Делегаты многоадресной рассылки — это делегаты, которые объединяют несколько вызовов методов. Ниже вы увидите примеры в этой серии.)
Группа разработчиков хотела, чтобы делегаты поддерживали ту же безопасность типа, ожидаемую от всех конструкций C#.
Наконец, команда признала, что шаблон событий является одним из конкретных шаблонов, где делегаты или любой алгоритм поздней привязки полезны. Разработчикам требовалось, чтобы код для делегатов служил основой для шаблона событий .NET.
Результатом всей этой работы стала поддержка делегатов и событий в C# и .NET.
Остальные статьи в этой серии будут охватывать функции языка, поддержку библиотек и распространенные идиомы, используемые при работе с делегатами и событиями. Вы узнаете:
- Ключевое слово
delegate
и какой код он создает. - Функции в
System.Delegate
классе и способы использования этих функций. - Создание делегатов, безопасных для типов.
- Создание методов, которые можно вызвать с помощью делегатов.
- Как работать с делегатами и событиями с помощью лямбда-выражений.
- Как делегаты становятся одним из стандартных блоков для LINQ.
- Как делегаты являются основой для шаблона событий .NET и как они отличаются.
Итак, приступим.