Делегаты (Руководство по программированию на 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#)