Поделиться через


Оператор Делегата

Используется для объявления делегата. Делегат — это ссылочный тип, который относится к 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 как type, parm2 как 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

См. также