Оператор 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

Ссылки

Оператор AddressOf

Of

Другие ресурсы

Делегаты в Visual Basic