Delegados e eventos
Um evento é uma mensagem enviada por um objeto para sinalizar a ocorrência de uma ação. A ação pode ser causada por interação do usuário, como um clique do mouse, ou pode ser acionada por alguma outra lógica de programa. O objeto que gera o evento é chamado de emissor do evento. O objeto que captura o evento e responde a ele é chamado de receptor do evento.
Na comunicação de evento, a classe de emissor de evento não sabe qual objeto ou método receberá (identificador) os eventos que ela gera. O que é necessário é um intermediário (ou mecanismo do tipo ponteiro) entre a fonte e o receptor. O .NET Framework define um tipo especial (Delegate) que fornece a funcionalidade de um ponteiro de função.
Um representante é uma classe que pode conter uma referência a um método. Diferentemente de outras classes, uma classe de representante tem uma assinatura, e ela pode conter referências apenas para os métodos que correspondem à sua assinatura. Um representante, portanto, é equivalente a um ponteiro de função Type-Safe ou a um retorno de chamada. Enquanto os representantes têm outros usos, a discussão aqui enfoca a funcionalidade manipulação de eventos dos representantes. Uma declaração de representante é suficiente para definir uma classe de representante. A declaração fornece a assinatura do representante, e o Common Language Runtime fornece a implementação. O exemplo a seguir mostra uma declaração de representante de evento.
Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
public delegate void AlarmEventHandler(Object^ sender, AlarmEventArgs^ e);
A sintaxe é semelhante a de uma declaração de método; no entanto, a palavra-chave delegate informa o compilador que AlarmEventHandler é um tipo de representante. Por convenção, representantes de evento no .NET Framework têm dois parâmetros, a fonte que gera o evento e os dados para o evento.
Uma instância do representante AlarmEventHandler pode vincular a qualquer método que corresponda à sua assinatura, como o método AlarmRang da classe WakeMeUp mostrado no exemplo a seguir.
Public Class WakeMeUp
' AlarmRang has the same signature as AlarmEventHandler.
Public Sub AlarmRang(sender As Object, e As AlarmEventArgs)
'...
End Sub
'...
End Class
public class WakeMeUp
{
// AlarmRang has the same signature as AlarmEventHandler.
public void AlarmRang(object sender, AlarmEventArgs e)
{
//...
}
//...
}
public ref class WakeMeUp
{
public:
// AlarmRang has the same signature as AlarmEventHandler.
void AlarmRang(Object^ sender, AlarmEventArgs^ e)
{
//...
}
//...
};
Representante de evento personalizados são necessárias somente quando um evento gera dados de evento. Muitos eventos, incluindo alguns eventos da interface do usuário, como cliques do mouse, não geram dados do evento. Em tais situações, o representante do evento fornecido na biblioteca de classes para o evento sem-dados, System.EventHandler,é adequado. Sua declaração vem a seguir.
Delegate Sub EventHandler(sender As Object, e As EventArgs)
delegate void EventHandler(object sender, EventArgs e);
delegate void EventtHandler(Object^ sender, EventArgs^ e);
Representantes de evento são multicast, o que significa que eles podem conter referências a mais de um método de manipulação de eventos. Para obter detalhes, consulte:Delegate. Representantes permitem flexibilidade e controle de detalhes na manipulação de eventos. Um representante atua como um distribuidor de evento para a classe que gera o evento ao manter uma lista de manipuladores de eventos registrados para o evento.
Para obter detalhes sobre como usar representantes para fornecer a funcionalidade de evento no seu componente ou controle, consulte Gerando um evento.
Para obter uma visão geral do consumo de eventos em seus aplicativos, consulte Consumindo Eventos.
Consulte também
Tarefas
Como: gerar e consumir eventos
Como: conectar métodos manipuladores de eventos a eventos