Оператор Delegate

Используется для объявления делегата. Делегат — это ссылочный тип, который относится к Shared методу типа или к методу экземпляра объекта. Для создания экземпляра этого класса делегата можно использовать любую процедуру с соответствующим параметром и типами возвращаемых значений. Затем процедуру можно вызвать с помощью экземпляра делегата.

Синтаксис

[ <attrlist> ] [ accessmodifier ] _  
[ Shadows ] Delegate [ Sub | Function ] name [( Of typeparamlist )] [([ parameterlist ])] [ As type ]  

Детали

Термин Определение
attrlist Необязательно. Список атрибутов, применяемых к этому делегату. Несколько атрибутов разделяются запятыми. Необходимо заключить список атрибутов в угловые скобки ("<" и ">").
accessmodifier Необязательно. Указывает, какой код может получить доступ к делегату. Может применяться один из перечисленных ниже типов.

- Общедоступная. Любой код, который может получить доступ к элементу, объявляющий делегат, может получить к нему доступ.
- Защищенный. Доступ к нему может получить только код в классе делегата или производном классе.
- Друг. Доступ к делегату может получить только код в одной сборке.
- Приватность. Только код в элементе, который объявляет, что делегат может получить к нему доступ.

- Защищенный код "Только друг" в классе делегата, производном классе или той же сборке может получить доступ к делегату.
- Закрытый защищенный код только в классе делегата или в производном классе в той же сборке может получить доступ к делегату.
Shadows Необязательно. Указывает, что этот делегат редекларирует и скрывает идентичный именованный элемент программирования или набор перегруженных элементов в базовом классе. Можно скрыть любой тип объявленного элемента, используя любой другой тип.

Скрытый элемент недоступен из производного класса, который его скрывает, за исключением тех классов, из которых недоступен скрывающий элемент. Например, если Private элемент тени элемента базового класса, код, который не имеет разрешения на доступ Private к элементу базового класса, обращается к элементу базового класса.
Sub Необязательный, но SubFunction должен отображаться либо. Объявляет эту процедуру как процедуру делегата Sub , которая не возвращает значение.
Function Необязательный, но SubFunction должен отображаться либо. Объявляет эту процедуру как процедуру делегата Function , возвращающую значение.
name Обязательный. Имя типа делегата; соответствует стандартным соглашениям об именовании переменных.
typeparamlist Необязательно. Список параметров типа для этого делегата. Несколько параметров типа разделяются запятыми. При необходимости каждый параметр типа может быть объявлен вариантом с помощью In и Out универсальных модификаторов. Необходимо заключить список типов в скобки и ввести его в Of ключевое слово.
parameterlist Необязательно. Список параметров, передаваемых процедуре при вызове. Необходимо заключить список параметров в скобки.
type Требуется, если указать процедуру Function . Тип данных возвращаемого значения.

Замечания

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

Делегаты можно объявлять на уровне пространства имен, модуля, класса или структуры, но не в рамках процедуры.

Каждый класс делегата определяет конструктор, которому передается спецификация метода объекта. Аргумент конструктора делегата должен быть ссылкой на метод или лямбда-выражение.

Чтобы указать ссылку на метод, используйте следующий синтаксис:

AddressOf [expression.]methodname

Тип expression во время компиляции должен представлять собой имя класса или интерфейса, который содержит метод с указанным именем, сигнатура которого соответствует сигнатуре класса делегата. methodname должен быть общим методом или методом экземпляра. methodname всегда является обязательным, даже если делегат создается для метода по умолчанию в классе.

Чтобы указать лямбда-выражение, используйте следующий синтаксис:

Function ([parm As type, parm2 As type2, ...]) expression

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

и делегатах.

Пример

В следующем примере оператор используется Delegate для объявления делегата для работы с двумя номерами и возврата числа. Метод DelegateTest принимает экземпляр делегата этого типа и использует его для работы с парами чисел.

Delegate Function MathOperator( 
    ByVal x As Double, 
    ByVal y As Double 
) As Double

Function AddNumbers( 
    ByVal x As Double, 
    ByVal y As Double 
) As Double
    Return x + y
End Function

Function SubtractNumbers( 
    ByVal x As Double, 
    ByVal y As Double
) As Double
    Return x - y
End Function

Sub DelegateTest( 
    ByVal x As Double, 
    ByVal op As MathOperator, 
    ByVal y As Double 
)
    Dim ret As Double
    ret = op.Invoke(x, y) ' Call the method.
    MsgBox(ret)
End Sub

Protected Sub Test()
    DelegateTest(5, AddressOf AddNumbers, 3)
    DelegateTest(9, AddressOf SubtractNumbers, 3)
End Sub

См. также