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