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

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

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

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

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

ПримечаниеПримечание

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

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

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

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

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

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

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

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

  • Точное соответствие методов сигнатуры делегата не требуется.Дополнительные сведения см. в разделе Использование вариативности в делегатах (C# и Visual Basic).

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

Delegate

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

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