Делегаты

Делегаты в программах Fore.NET позволяют реализовывать сценарии, которые в других языках реализуются посредством указателей на функции. В отличие от указателей на функции делегаты являются полностью объектно-ориентированными и инкапсулируют вместе ссылку на объект и его метод.

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

Определение делегатов

Определение делегатов производится следующим образом.

delegate-declaration:

attributesopt   delegate-modifiersopt   Delegate   identifier

formal-parameter-listopt   delegate-return-typeopt   ;

delegate-return-type:

:   return-type

delegate-modifiers:

delegate-modifier

delegate-modifiers   delegate-modifier

delegate-modifier:

Public

Friend

Является ошибкой компиляции повторное использование одного модификатора в определении делегата.

Метод и делегат являются совместимыми если выполняются оба следующих условия:

Единственным способом определения делегата является использование приведенной выше языковой конструкции. Типом делегата является тип, производный от системного System.Delegate. Типы-делегаты являются неявно завершенными и не допускается определение типов, производных от делегатов. Также не допускается определение типов, производных от System.Delegate и не являющихся делегатами.

Язык предоставляет специальный синтаксис для создания и вызова делегатов. За исключением создания экземпляра любая операция, которая может быть применима к классу или экземпляру объекта класса может быть применена также к классу делегату или экземпляру делегата соответственно. В частности, возможно обращаться к членам System.Delegate посредством обычного синтаксиса доступа к члену.

Множество методов, инкапсулируемых экземпляром делегата, называется списком вызовов. Когда экземпляр делегата создается на основе единичного метода он инкапсулирует этот метод и его список вызовов содержит только один элемент. При объединении двух непустых делегатов их списки вызовов конкатенируются в порядке слева направо.

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

См.также:

Описания и синтаксические правила