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


Оператор Delegate

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

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

Части

Термин

Определение

attrlist

Необязательный.Список атрибутов, которые применяются для данного делегата.Несколько атрибутов разделяются запятыми.Необходимо заключить Список атрибутов (Visual Basic) в угловые скобки ("<" и ">").

accessmodifier

Необязательный.Указывает код, который может получить доступ к делегату.Может принимать следующие значения:

  • Public.Любой код, который имеет доступ к объявляемому делегатом элементу, также имеет доступ к самому элементу.

  • Protected.Только код в пределах класса делегата или производного класса может обратиться к делегату.

  • Friend.Только код внутри одной и той же сборки имеет доступ к делегату.

  • Private.Только код внутри объявляемого делегатом элемента имеет доступ к самому делегату.

Можно указать Protected Friend, чтобы разрешить доступ из кода внутри класса делегата, производного класса или той же сборки.

Shadows

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

Скрытый элемент недоступен из производного класса, в котором он скрыт, за исключением местоположений, где он является недоступным.Например, если элемент Private скрывает элемент базового класса, код, который не имеет разрешение на доступ к элементу Private, обращается к элементу базового класса.

Sub

Необязательно, но требуется наличие Sub или Function.Объявляет процедуру делегатом-подпрограммой Sub, которая не возвращает значения.

Function

Необязательно, но требуется наличие Sub или Function.Объявляет процедуру делегатом-подпрограммой Function, которая не возвращает значения.

name

Обязательный.Имя типа делегата, следует стандартным правилам именования переменных.

typeparamlist

Необязательный.Список параметров типа для данного делегата.Несколько параметров типа разделяются запятыми.При желании каждый параметр типа можно объявить как вариант с помощью универсальных модификаторов In и Out.Необходимо заключить Список типов (Visual Basic) в круглые скобки и ввести его вместе с ключевым словом Of.

parameterlist

Необязательный.Список параметров, передаваемых в процедуру при ее вызове.Необходимо заключить Список параметров (Visual Basic) в круглые скобки.

type

Требуется, если указана процедура Function.Тип данных возвращаемого значения.

Заметки

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

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

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

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

AddressOf [expression.]methodname

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

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

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

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

Дополнительные сведения о делегатах см. в разделе Делегаты (Visual Basic).

Пример

Следующий пример использует оператор 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 (Visual Basic)

Предложение Of (Visual Basic)

In (универсальный модификатор) (Visual Basic)

Out (универсальный модификатор) (Visual Basic)

Основные понятия

Универсальные типы в Visual Basic (Visual Basic)

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

Делегаты (Visual Basic)

Ковариация и контравариация (C# и Visual Basic)