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


Делегаты (руководство по программированию на C#)

делегат — это тип, который представляет ссылки на методы с определенным списком параметров и типом возврата. При создании экземпляра делегата можно связать экземпляр делегата с любым методом, который имеет совместимую сигнатуру и тип возвращаемого значения. Метод можно вызывать (или обращаться к нему) с помощью экземпляра делегата.

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

В следующем примере показано объявление делегата:

public delegate int PerformCalculation(int x, int y);

Можно назначить любой метод из любого доступного класса или структуры, которые соответствуют типу делегата, этому делегату. Метод может быть статическим или методом экземпляра. Гибкость позволяет программным способом изменять вызовы методов или подключать новый код к существующим классам.

Заметка

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

Возможность ссылаться на метод как параметр делает делегаты идеальными для определения методов обратного вызова. Вы можете написать метод, который сравнивает два объекта в приложении. Затем метод можно использовать в делегате для алгоритма сортировки. Так как код сравнения отличается от библиотеки, метод сортировки может быть более общим.

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

Изучение характеристик делегата

Делегаты имеют следующие характеристики:

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

Дополнительные сведения о делегатах см. в следующих статьях:

Доступ к спецификации языка C#

Спецификация языка является окончательным источником для синтаксиса И использования C#. Для получения дополнительной информации см. раздел Делегаты в спецификации языка C# .