Поделиться через


Общие сведения о делегатах и событиях в C#

Делегаты предоставляют механизм поздней привязки в .NET. Поздняя привязка означает, что создается алгоритм, в котором вызывающий объект также предоставляет по крайней мере один метод, реализующий часть алгоритма.

Например, рассмотрите возможность сортировки списка звезд в астрономическом приложении. Вы можете сортировать эти звезды по их расстоянию от земли, или величину звезды, или их воспринимаемую яркость.

Во всех этих случаях метод Sort() выполняет по существу одно и то же: упорядочивает элементы в списке на основе некоторого сравнения. Код, сравнивающий две звезды, отличается для каждого порядка сортировки.

Эти типы решений использовались в программном обеспечении в течение полувека. Концепция делегатов в языке C# обеспечивает поддержку языка на высшем уровне и безопасность типов в рамках концепции.

Как вы увидите далее в этой серии, код C#, который вы пишете для алгоритмов, таких как этот тип, является безопасным. Компилятор гарантирует, что типы соответствуют аргументам и возвращаемым типам.

указатели функций поддерживают аналогичные сценарии, где требуется больше контроля над соглашением о вызовах. Код, связанный с делегатом, вызывается с помощью виртуального метода, добавленного в тип делегата. С помощью указателей функций можно указать различные соглашения.

Цели проектирования языка для делегатов

Конструкторы языков перечислили несколько целей для функции, которая в конечном итоге стала делегатами.

Команда хотела создать общую языковую конструкцию, которая может использоваться для любых поздних алгоритмов привязки. Делегаты позволяют разработчикам изучать одну концепцию и использовать ту же концепцию во многих различных проблемах программного обеспечения.

Во-вторых, команда хотела поддерживать вызовы методов единичной передачи и многоадресной передачи. (Делегаты многоадресной рассылки — это делегаты, которые объединяют несколько вызовов методов. Ниже вы увидите примеры в этой серии.)

Команда хотела, чтобы делегаты поддерживали ту же безопасность типов, которую разработчики ожидают от всех конструкций C#.

Наконец, команда признала, что шаблон событий является одним из конкретных шаблонов, где делегаты или любой алгоритм поздней привязки полезны. Команда хотела убедиться, что код делегатов может служить основой для шаблона событий .NET.

Результатом всей этой работы стала поддержка делегатов и событий в C# и .NET.

Остальные статьи в этой серии будут охватывать функции языка, поддержку библиотек и распространенные идиомы, используемые при работе с делегатами и событиями. Вы узнаете:

  • Ключевое delegate слово и код, который он создает.
  • Функции в System.Delegate классе и способы использования этих функций.
  • Как создать безопасные для типов делегаты.
  • Как создать методы, которые можно вызывать с помощью делегатов.
  • Как работать с делегатами и событиями с помощью лямбда-выражений.
  • Как делегаты становятся одним из строительных блоков в LINQ.
  • Как делегаты являются основой для шаблона событий .NET и как они отличаются.

Давайте начнем.

Далее