Оператор DelegateDelegate Statement

Используется для объявления делегата.Used to declare a delegate. Делегат — это ссылочный тип, который ссылается на Shared метод типа или на метод экземпляра объекта.A delegate is a reference type that refers to a Shared method of a type or to an instance method of an object. Для создания экземпляра этого класса делегата можно использовать любую процедуру с соответствующими параметрами и типами возвращаемых данных.Any procedure with matching parameter and return types can be used to create an instance of this delegate class. Затем процедуру можно вызвать позже с помощью экземпляра делегата.The procedure can then later be invoked by means of the delegate instance.

СинтаксисSyntax

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

КомпонентыParts

ТерминTerm ОпределениеDefinition
attrlist Необязательный элемент.Optional. Список атрибутов, применяемых к этому делегату.List of attributes that apply to this delegate. Несколько атрибутов разделяются запятыми.Multiple attributes are separated by commas. Список атрибутов необходимо заключить в угловые скобки (" < " и " > ").You must enclose the Attribute List in angle brackets ("<" and ">").
accessmodifier Необязательный элемент.Optional. Указывает, какой код может получить доступ к делегату.Specifies what code can access the delegate. Может принимать следующие значения:Can be one of the following:

- Общедоступная.- Public. Любой код, который может получить доступ к элементу, который объявляет делегат, может получить к нему доступ.Any code that can access the element that declares the delegate can access it.
- Защищено.- Protected. Доступ к нему могут получить только код внутри класса делегата или производного класса.Only code within the delegate's class or a derived class can access it.
- Дружественный.- Friend. Доступ к делегату могут получить только код в той же сборке.Only code within the same assembly can access the delegate.
- Частный.- Private. Только код внутри элемента, объявляющего делегат, может получить к нему доступ.Only code within the element that declares the delegate can access it.

- Защищенный дружественный Доступ к делегату могут получить только код внутри класса делегата, производного класса или той же сборки.- Protected Friend Only code within the delegate's class, a derived class, or the same assembly can access the delegate.
- Частный защищенный Доступ к делегату могут получить только код внутри класса делегата или в производном классе в той же сборке.- Private Protected Only code within the delegate's class or in a derived class in the same assembly can access the delegate.
Shadows Необязательный элемент.Optional. Указывает, что этот делегат повторно объявляет и скрывает идентично именованный элемент программирования или набор перегруженных элементов в базовом классе.Indicates that this delegate redeclares and hides an identically named programming element, or set of overloaded elements, in a base class. Можно скрыть любой тип объявленного элемента, используя любой другой тип.You can shadow any kind of declared element with any other kind.

Скрытый элемент недоступен из производного класса, который его скрывает, за исключением тех классов, из которых недоступен скрывающий элемент.A shadowed element is unavailable from within the derived class that shadows it, except from where the shadowing element is inaccessible. Например, если Private элемент затеняет элемент базового класса, код, который не имеет разрешения на доступ к Private элементу, обращается к элементу базового класса.For example, if a Private element shadows a base class element, code that does not have permission to access the Private element accesses the base class element instead.
Sub Необязательный, Sub но Function должен быть либо.Optional, but either Sub or Function must appear. Объявляет эту процедуру как процедуру-делегат Sub , которая не возвращает значение.Declares this procedure as a delegate Sub procedure that does not return a value.
Function Необязательный, Sub но Function должен быть либо.Optional, but either Sub or Function must appear. Объявляет эту процедуру как процедуру-делегат Function , которая возвращает значение.Declares this procedure as a delegate Function procedure that returns a value.
name Обязательный.Required. Имя типа делегата; соответствует стандартным соглашениям об именовании переменных.Name of the delegate type; follows standard variable naming conventions.
typeparamlist Необязательный элемент.Optional. Список параметров типа для этого делегата.List of type parameters for this delegate. Несколько параметров типа разделяются запятыми.Multiple type parameters are separated by commas. При необходимости каждый параметр типа можно объявить как Variant с помощью In Out модификаторов и.Optionally, each type parameter can be declared variant by using In and Out generic modifiers. Необходимо заключить список типов в круглые скобки и ввести его с помощью Of ключевого слова.You must enclose the Type List in parentheses and introduce it with the Of keyword.
parameterlist Необязательный элемент.Optional. Список параметров, которые передаются в процедуру при ее вызове.List of parameters that are passed to the procedure when it is called. Список параметров необходимо заключить в круглые скобки.You must enclose the Parameter List in parentheses.
type Требуется, если указана Function процедура.Required if you specify a Function procedure. Тип данных возвращаемого значения.Data type of the return value.

КомментарииRemarks

DelegateОператор определяет параметры и возвращаемые типы класса делегата.The Delegate statement defines the parameter and return types of a delegate class. Для создания экземпляра этого класса делегата можно использовать любую процедуру с соответствующими параметрами и типами возвращаемых данных.Any procedure with matching parameters and return types can be used to create an instance of this delegate class. Затем процедуру можно вызвать с помощью экземпляра делегата, вызвав метод делегата Invoke .The procedure can then later be invoked by means of the delegate instance, by calling the delegate's Invoke method.

Делегаты могут быть объявлены на уровне пространства имен, модуля, класса или структуры, но не внутри процедуры.Delegates can be declared at the namespace, module, class, or structure level, but not within a procedure.

Каждый класс делегата определяет конструктор, которому передается спецификация метода объекта.Each delegate class defines a constructor that is passed the specification of an object method. Аргумент конструктора делегата должен быть ссылкой на метод или лямбда-выражение.An argument to a delegate constructor must be a reference to a method, or a lambda expression.

Чтобы указать ссылку на метод, используйте следующий синтаксис:To specify a reference to a method, use the following syntax:

AddressOf [expression.]methodnameAddressOf [expression.]methodname

Тип expression во время компиляции должен представлять собой имя класса или интерфейса, который содержит метод с указанным именем, сигнатура которого соответствует сигнатуре класса делегата.The compile-time type of the expression must be the name of a class or an interface that contains a method of the specified name whose signature matches the signature of the delegate class. methodname должен быть общим методом или методом экземпляра.The methodname can be either a shared method or an instance method. methodname всегда является обязательным, даже если делегат создается для метода по умолчанию в классе.The methodname is not optional, even if you create a delegate for the default method of the class.

Чтобы указать лямбда-выражение, используйте следующий синтаксис:To specify a lambda expression, use the following syntax:

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

Сигнатура функции должна соответствовать сигнатуре типа делегата.The signature of the function must match that of the delegate type. Дополнительные сведения о лямбда-выражениях см. в разделе лямбда-выражения.For more information about lambda expressions, see Lambda Expressions.

и делегатах.For more information about delegates, see Delegates.

ПримерExample

В следующем примере оператор используется Delegate для объявления делегата для работы с двумя числами и возвращения числа.The following example uses the Delegate statement to declare a delegate for operating on two numbers and returning a number. DelegateTestМетод принимает экземпляр делегата этого типа и использует его для работы с парами чисел.The DelegateTest method takes an instance of a delegate of this type and uses it to operate on pairs of numbers.

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

См. также разделSee also