Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Используется для объявления делегата. Делегат — это ссылочный тип, который относится к Shared
методу типа или к методу экземпляра объекта. Для создания экземпляра этого класса делегата можно использовать любую процедуру с соответствующим параметром и типами возвращаемых значений. Затем процедуру можно вызвать с помощью экземпляра делегата.
Синтаксис
[ <attrlist> ] [ accessmodifier ] _
[ Shadows ] Delegate [ Sub | Function ] name [( Of typeparamlist )] [([ parameterlist ])] [ As type ]
Комплектующие
Срок | Определение |
---|---|
attrlist |
Необязательно. Список атрибутов, применяемых к этому делегату. Несколько атрибутов разделены запятыми. Необходимо заключить список атрибутов в угловые скобки ("< " и "> "). |
accessmodifier |
Необязательно. Указывает, какой код может получить доступ к делегату. Может быть одним из следующих вариантов: - Общедоступная. Любой код, который может получить доступ к элементу, объявляющий делегат, может получить к нему доступ. - Защищенный. Доступ к нему может получить только код в классе делегата или производном классе. - Друг. Доступ к делегату может получить только код в одной сборке. - Частный. Только код в элементе, который объявляет, что делегат может получить к нему доступ. - Защищенный друг Доступ к делегату может получить только код в классе делегата, производном классе или той же сборке. - Закрытый защищенный Доступ к делегату может получить только код в классе делегата или в производном классе в той же сборке. |
Shadows |
Необязательно. Указывает, что этот делегат редекларирует и скрывает идентичный именованный элемент программирования или набор перегруженных элементов в базовом классе. Вы можете тень любого объявленного элемента с любым другим видом. Теневой элемент недоступен из производного класса, который тенирует его, за исключением того, где недоступен элемент тени. Например, если Private элемент тени элемента базового класса, код, который не имеет разрешения на доступ Private к элементу базового класса, обращается к элементу базового класса. |
Sub |
Необязательный, но Sub Function должен отображаться либо. Объявляет эту процедуру как процедуру делегата Sub , которая не возвращает значение. |
Function |
Необязательный, но Sub Function должен отображаться либо. Объявляет эту процедуру как процедуру делегата 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