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

Обновлен: Ноябрь 2007

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

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

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

ms173171.alert_note(ru-ru,VS.90).gifПримечание.

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

Благодаря возможности ссылаться на метод как на параметр делегаты оптимально подходят для задания функций обратного вызова. Например, алгоритм сортировки можно передать как ссылку на метод, сравнивающий два объекта. Отделение кода сравнения позволяет составить алгоритм в более общем виде.

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

Делегаты имеют следующие свойства.

  • Делегаты похожи на указатели функций в C++, но являются строго типизированными.

  • Делегаты допускают передачу методов в качестве параметров.

  • Делегаты можно использовать для задания функций обратного вызова.

  • Делегаты можно связывать друг с другом; например, несколько методов можно вызвать по одному событию.

  • Точное соответствие методов подписи делегата не требуется. Дополнительные сведения см. в разделе Covariance and ContravarianceКовариация и контрвариация в делегатах (руководство по программированию в C#).

  • В C# версии 2.0 представлена концепция анонимных методов, которые позволяют передавать блоки кода в виде параметров вместо использования отдельно определенного метода. В C# 3.0 для краткой записи встроенных блоков кода введены лямбда-выражения. В результате компиляции как анонимных методов, так и лямбда-выражений (в определенном контексте) получаются типы делегатов. В настоящее время эти функции объединяются под одним названием — анонимные функции. Дополнительные сведения о лямбда-выражениях см. в разделе Анонимные функции (Руководство по программированию в C#).

Содержание

Спецификация языка C#

Дополнительные сведения см. в следующих разделах документа Спецификация языка C#:

  • 1.11 Делегаты

  • 4.2.6 Типы делегатов

  • 7.5.5.3 Вызов делегатов

  • 15 Делегаты

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

События (Руководство по программированию в C#)

Delegate