Instrução DelegateDelegate Statement

Usado para declarar um delegado.Used to declare a delegate. Um delegado é um tipo de referência que se refere a um método Shared de um tipo ou a um método de instância de um objeto.A delegate is a reference type that refers to a Shared method of a type or to an instance method of an object. Qualquer procedimento com parâmetros correspondentes e tipos de retorno pode ser usado para criar uma instância dessa classe delegate.Any procedure with matching parameter and return types can be used to create an instance of this delegate class. O procedimento pode ser posteriormente invocado por meio da instância de delegado.The procedure can then later be invoked by means of the delegate instance.

SintaxeSyntax

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

PartesParts

TermoTerm DefiniçãoDefinition
attrlist Opcional.Optional. Lista de atributos que se aplicam a este delegado.List of attributes that apply to this delegate. Vários atributos são separados por vírgulas.Multiple attributes are separated by commas. Você deve colocar a lista de atributos entre colchetes angulares ("<" e ">").You must enclose the Attribute List in angle brackets ("<" and ">").
accessmodifier Opcional.Optional. Especifica qual código pode acessar o delegado.Specifies what code can access the delegate. Pode ser um dos seguintes:Can be one of the following:

- público.- Public. Qualquer código que possa acessar o elemento que declara o delegado pode acessá-lo.Any code that can access the element that declares the delegate can access it.
- protegido.- Protected. Somente o código dentro da classe do delegado ou de uma classe derivada pode acessá-lo.Only code within the delegate's class or a derived class can access it.
- amigo.- Friend. Somente o código dentro do mesmo assembly pode acessar o delegado.Only code within the same assembly can access the delegate.
- privado.- Private. Somente o código dentro do elemento que declara o delegado pode acessá-lo.Only code within the element that declares the delegate can access it.

- somente Friend Protected código dentro da classe do delegado, uma classe derivada ou o mesmo assembly podem acessar o delegado.- Protected Friend Only code within the delegate's class, a derived class, or the same assembly can access the delegate.
- código protegido somente particular dentro da classe do delegado ou em uma classe derivada no mesmo assembly pode acessar o delegado.- Private Protected Only code within the delegate's class or in a derived class in the same assembly can access the delegate.
Shadows Opcional.Optional. Indica que esse delegado redeclara e oculta um elemento de programação de nome idêntico, ou conjunto de elementos sobrecarregados, em uma classe base.Indicates that this delegate redeclares and hides an identically named programming element, or set of overloaded elements, in a base class. Você pode sombrear qualquer tipo de elemento declarado com qualquer outro tipo.You can shadow any kind of declared element with any other kind.

Um elemento sombreado não está disponível de dentro da classe derivada que o sombreia, exceto de onde o elemento de sombreamento está inacessível.A shadowed element is unavailable from within the derived class that shadows it, except from where the shadowing element is inaccessible. Por exemplo, se um elemento Private sombreia um elemento de classe base, o código que não tem permissão para acessar o elemento Private acessa o elemento da classe base em vez disso.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 Opcional, mas Sub ou Function devem aparecer.Optional, but either Sub or Function must appear. Declara esse procedimento como um delegado Sub procedimento que não retorna um valor.Declares this procedure as a delegate Sub procedure that does not return a value.
Function Opcional, mas Sub ou Function devem aparecer.Optional, but either Sub or Function must appear. Declara esse procedimento como um delegado Function procedimento que retorna um valor.Declares this procedure as a delegate Function procedure that returns a value.
name Necessário.Required. Nome do tipo delegado; segue as convenções padrão de nomenclatura de variável.Name of the delegate type; follows standard variable naming conventions.
typeparamlist Opcional.Optional. Lista de parâmetros de tipo para este delegado.List of type parameters for this delegate. Vários parâmetros de tipo são separados por vírgulas.Multiple type parameters are separated by commas. Opcionalmente, cada parâmetro de tipo pode ser declarado como Variant usando In e Out modificadores genéricos.Optionally, each type parameter can be declared variant by using In and Out generic modifiers. Você deve colocar a lista de tipos entre parênteses e apresentá-la com a palavra-chave Of.You must enclose the Type List in parentheses and introduce it with the Of keyword.
parameterlist Opcional.Optional. Lista de parâmetros que são passados para o procedimento quando ele é chamado.List of parameters that are passed to the procedure when it is called. Você deve colocar a lista de parâmetros entre parênteses.You must enclose the Parameter List in parentheses.
type Necessário se você especificar um procedimento de Function.Required if you specify a Function procedure. Tipo de dados do valor de retorno.Data type of the return value.

ComentáriosRemarks

A instrução Delegate define o parâmetro e os tipos de retorno de uma classe delegate.The Delegate statement defines the parameter and return types of a delegate class. Qualquer procedimento com parâmetros e tipos de retorno correspondentes pode ser usado para criar uma instância dessa classe delegate.Any procedure with matching parameters and return types can be used to create an instance of this delegate class. O procedimento pode ser posteriormente invocado por meio da instância de delegado, chamando o método de Invoke do delegado.The procedure can then later be invoked by means of the delegate instance, by calling the delegate's Invoke method.

Os delegados podem ser declarados no nível de namespace, módulo, classe ou estrutura, mas não dentro de um procedimento.Delegates can be declared at the namespace, module, class, or structure level, but not within a procedure.

Cada classe de delegado define um construtor que é passado para a especificação de um método do objeto.Each delegate class defines a constructor that is passed the specification of an object method. Um argumento para o construtor delegado deve ser uma referência a um método ou uma expressão lambda.An argument to a delegate constructor must be a reference to a method, or a lambda expression.

Para especificar uma referência a um método, use a seguinte sintaxe:To specify a reference to a method, use the following syntax:

AddressOf [expression.]methodnameAddressOf [expression.]methodname

O tipo de tempo de compilação do expression deve ser o nome de uma classe ou uma interface que contém um método do nome especificado cuja assinatura coincide com a assinatura da classe delegada.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. O methodname pode ser um método compartilhado ou um método de instância.The methodname can be either a shared method or an instance method. O methodname não é opcional, mesmo se você criar um delegado para o método padrão da classe.The methodname is not optional, even if you create a delegate for the default method of the class.

Para especificar uma expressão lambda, use a seguinte sintaxe:To specify a lambda expression, use the following syntax:

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

A assinatura da função deve corresponder a do tipo delegado.The signature of the function must match that of the delegate type. Para obter mais informações sobre expressões lambda, consulte Expressões lambda.For more information about lambda expressions, see Lambda Expressions.

Para obter mais informações sobre delegados, confira Delegados.For more information about delegates, see Delegates.

ExemploExample

O exemplo a seguir usa a instrução Delegate para declarar um delegado para operar em dois números e retornar um número.The following example uses the Delegate statement to declare a delegate for operating on two numbers and returning a number. O método DelegateTest usa uma instância de um delegado desse tipo e a usa para operar em pares de números.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

Consulte tambémSee also