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