Compartilhar via


Delegados e o operador AddressOf

Delegados são objetos que você pode usar para chamar os métodos de outros objetos.Às vezes, eles são descritos como função de tipo seguro ponteiros porque eles são semelhante à função ponteiros usados em outras linguagens de programação.Mas diferentemente ponteiros de função, Visual Basic Delegados são um tipo de referência com base na classe System.Delegate de.Representantes podem fazer referência ambos os métodos compartilhados — os métodos que podem ser chamados sem uma instância específica de uma classe — e instância métodos.

Eventos e representantes

Delegados são úteis em situações em que é necessário um intermediário entre um procedimento de chamada e o Procedimento sendo chamado.Por exemplo, você pode querer um objeto que gera eventos para poder chamar manipuladores de eventos diferentes em diferentes circunstâncias.Infelizmente, o objeto aumentando os eventos não podem saber antecipadamente o manipulador de eventos está lidando com um evento específico.Visual Basic permite que você manipuladores de eventos associar dinamicamente com eventos, criando um delegado para você quando você usa o AddHandler demonstrativo. Em tempo de execução, o representante encaminha chamadas para o manipulador de eventos apropriado.

Embora você possa criar seus próprios representantes, na maioria dos casos Visual Basic cria o representante e cuida dos detalhes para você.Por exemplo, uma instrução Event implicitamente define uma classe delegate chamada <EventName>EventHandler como uma classe aninhada da classe que contém a instrução Event e com a mesma assinatura do evento.A instrução AddressOf implicitamente cria uma instância de um representante.Por exemplo, as duas linhas de código a seguir são equivalentes:

AddHandler Button1.Click, AddressOf Me.Button1_Click
' The previous line of code is shorthand for the next line of code.
AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)

Você pode usar a forma abreviada maneira de criar representantes em qualquer lugar o compilador pode determinar o contexto o representante do tipo.

Declarando eventos que usam um tipo delegate existente

Em algumas situações, convém declarar um evento para usar um tipo delegate existente como seu representante subjacente.A sintaxe a seguir demonstra como:

Delegate Sub DelegateType()
Event AnEvent As DelegateType

Isso é útil quando você deseja rotear vários eventos para o mesmo manipulador.

Representante variáveis e parâmetros

Você pode usar delegados para outros, Non-Event relacionados tarefas, como segmentação livre ou com os procedimentos que precisem chamar diferentes versões de funções em tempo de compilação.

Por exemplo, suponha que você tenha um aplicativo classified-AD que inclui um caixa de listagem com os nomes dos carros.Os anúncios são classificados por título, que é normalmente a marca do carro.Você pode enfrentar um problema ocorre quando alguns carros incluem o ano do carro antes de tornar.O problema é que a funcionalidade interna de classificação de caixa de listagem classifica somente por códigos de caracteres; ele coloca todos os anúncios começando com datas primeiro, seguido de anúncios começando com o fabricante.

Para corrigir isso, você pode criar um procedimento de classificação em uma classe que usa a classificação alfabética padrão na maioria das caixas de listagem, mas é possível alternar para o procedimento de classificação personalizada para anúncios de carro em tempo de execução.Para fazer isso, você passar o procedimento de classificação personalizada para a classe Classificação em tempo de execução, com delegates.

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

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

AddressOf [expression.]methodName

O compile-time type 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 de classe Delegate.O methodName pode ser um método compartilhado ou um método de instância.methodName não é opcional, mesmo se você criar um representante para o método padrão da classe.

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

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

A assinatura de função deve corresponder do tipo delegate.Para obter mais informações sobre expressões lambda, consulte Expressões Lambda.

Consulte também

Tarefas

Como: PASS procedimentos como outro procedimento no Visual Basic

Como: Invoke um método de representante

Como: Escrever manipuladores evento

Conceitos

Expressões Lambda

Eventos e manipuladores de eventos

AddHandler e RemoveHandler

Aplicativos Multithreaded

Referência

Instrução Delegate

Operador AddressOf