Instrução Delegate

Usada para declarar um delegado. 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. Qualquer procedimento com parâmetros e tipos de retorno correspondentes pode ser usado para criar uma instância dessa classe delegada. Em seguida, o procedimento pode ser invocado posteriormente por meio da instância delegada.

Sintaxe

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

Partes

Termo Definição
attrlist Opcional. Lista de atributos que se aplicam a esse delegado. Vários atributos são separados por vírgulas. Você deve colocar a Lista de atributos entre colchetes angulares ("<" e ">").
accessmodifier Opcional. Especifica qual código pode acessar o delegado. Um dos seguintes pode ser feito:

- Público. Qualquer código que possa acessar o elemento que declara o delegado pode acessá-lo.
- Protegido. Somente o código dentro da classe do delegado ou de uma classe derivada pode acessá-lo.
- Amigo. Somente o código dentro do mesmo assembly pode acessar o delegado.
- Particular. Somente o código dentro do elemento que declara o delegado pode acessá-lo.

- Amigo Protegido Somente o código dentro da classe do delegado, de uma classe derivada ou do mesmo assembly pode acessar o delegado.
- Protegido de forma particular Somente o código dentro da classe do delegado, de uma classe derivada ou do mesmo assembly pode acessar o delegado.
Shadows Opcional. Indica que esse delegado redeclara novamente e oculta um elemento de programação nomeado de maneira idêntica, ou conjunto de elementos sobrecarregados, em uma classe base. Você pode sombrear qualquer tipo de elemento declarado com qualquer outro tipo.

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. Por exemplo, se um elemento Private sombrear um elemento de classe base, o código que não tem permissão para acessar o elemento Private acessará o elemento de classe base.
Sub Opcional, mas Sub ou Function deve aparecer. Declara esse procedimento como um procedimento Sub delegado que não retorna um valor.
Function Opcional, mas Sub ou Function deve aparecer. Declara esse procedimento como um procedimento Function delegado que retorna um valor.
name Obrigatórios. Nome do tipo de delegado; segue as convenções de nomenclatura de variáveis padrão.
typeparamlist Opcional. Lista de parâmetros de tipo para esse delegado. Vários parâmetros de tipo são separados por vírgulas. Como opção, cada parâmetro de tipo pode ser declarado variante usando os modificadores In e Out genéricos. Você deve colocar a Lista de Tipos entre parênteses e apresentá-la com a palavra-chave Of.
parameterlist Opcional. Lista de parâmetros passados para o procedimento quando ele é chamado. Você deve colocar a Lista de Parâmetros entre parênteses.
type Obrigatório se você especificar um procedimento Function. Tipo de dados do valor retornado.

Comentários

A instrução Delegate define o parâmetro e os tipos de retorno de uma classe delegada. Qualquer procedimento com parâmetros e tipos de retorno correspondentes pode ser usado para criar uma instância dessa classe delegada. Em seguida, o procedimento pode ser invocado posteriormente por meio da instância delegada, chamando o método Invoke do delegado.

Os delegados podem ser declarados no namespace, no módulo, na classe ou no nível de estrutura, mas não dentro de um procedimento.

Cada classe de delegado define um construtor que é passado para a especificação de um método do objeto. Um argumento para o construtor delegado deve ser uma referência a um método ou uma expressão lambda.

Para especificar uma referência a um método, use a seguinte sintaxe:

AddressOf [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. O methodname pode ser um método compartilhado ou um método de instância. O methodname não é opcional, mesmo se você criar um delegado para o método padrão da classe.

Para especificar uma expressão lambda, use a seguinte sintaxe:

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

A assinatura da função deve corresponder a do tipo delegado. Para obter mais informações sobre expressões lambda, consulte Expressões lambda.

Para obter mais informações sobre delegados, confira Delegados.

Exemplo

O exemplo a seguir usa a instrução Delegate para declarar um delegado para operar em dois números e retornar um número. O método DelegateTest usa uma instância de um delegado desse tipo e o usa para operar em pares de números.

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

Confira também