Делегаты (Руководство по программированию на C#)
Делегат — это тип, который определяет сигнатуру метода.При создании экземпляра делегата можно связать этот экземпляр с любым методом с совместимой сигнатурой.Метод можно запустить (или вызвать) с помощью экземпляра делегата.
Делегаты используются для передачи методов в качестве аргументов к другим методам.Обработчики событий — это ничто иное, как методы, вызываемые с помощью делегатов.Создание пользовательского метода и класса, например элемента управления Windows, может вызывать метод при возникновении определенного события.В следующем примере показано объявление делегата:
public delegate int PerformCalculation(int x, int y);
Делегату можно назначить любой метод из любого доступного класса или структуры, соответствующий сигнатуре делегата, которая состоит из типа возвращаемого значения и параметров.Этот метод должен быть статическим методом или методом экземпляра.Это позволяет программно изменять вызовы метода, а также включать новый код в существующие классы.Если сигнатура делегата известна, то можно назначить собственный метод.
Примечание |
---|
В контексте перегрузки метода сигнатура метода не содержит возвращаемое значение.Однако в контексте делегатов сигнатура метода содержит возвращаемое значение.Другими словами, метод должен иметь то же возвращаемое значение, что и делегат. |
Благодаря возможности ссылаться на метод как на параметр делегаты оптимально подходят для задания функций обратного вызова.Например, ссылка на метод, сравнивающий два значения, которые можно передать в качестве аргумента алгоритму сортировки.Поскольку код сравнения находится в отдельной процедуре, алгоритм сортировки может быть написан более общим образом.
Общие сведения о делегатах
Делегаты имеют следующие свойства.
Делегаты похожи на указатели функций в C++, но являются типобезопасными.
Делегаты допускают передачу методов в качестве параметров.
Делегаты можно использовать для задания функций обратного вызова.
Делегаты можно связывать друг с другом; например, несколько методов можно вызвать по одному событию.
Точное соответствие методов сигнатуры делегата не требуется.Дополнительные сведения см. в разделе Использование вариативности в делегатах (C# и Visual Basic).
В C# версии 2.0 представлена концепция анонимных методов, которые позволяют передавать блоки кода в виде параметров вместо использования отдельно определенного метода.В C# 3.0 для краткой записи встроенных блоков кода введены лямбда-выражения.В результате компиляции как анонимных методов, так и лямбда-выражений (в определенном контексте) получаются типы делегатов.В настоящее время эти функции объединяются под одним названием — анонимные функции.Дополнительные сведения о лямбда-выражениях см. в разделе Анонимные функции (Руководство по программированию на C#).
Содержание
Использование делегатов (Руководство по программированию на C#)
Использование делегатов вместо интерфейсов (Руководство по программированию в C#)
Спецификация языка C#
Дополнительные сведения см в Спецификация языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
Главы в популярных книгах
Delegates, Events, and Lambda Expressions в книге C# 3.0 Cookbook, Third Edition: More than 250 solutions for C# 3.0 programmers
Delegates and Events в книге Learning C# 3.0: Master the fundamentals of C# 3.0
См. также
Ссылки
События (Руководство по программированию в C#)