Делегаты в программах 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 посредством обычного синтаксиса доступа к члену.
Множество методов, инкапсулируемых экземпляром делегата, называется списком вызовов. Когда экземпляр делегата создается на основе единичного метода он инкапсулирует этот метод и его список вызовов содержит только один элемент. При объединении двух непустых делегатов их списки вызовов конкатенируются в порядке слева направо.
Дополнительная информация представлена в следующих подразделах:
См.также: