Como realizar e cancelar a assinatura de eventos (Guia de Programação em C#)
Você assina um evento publicado por outra classe quando quer escrever um código personalizado que é chamado quando esse evento é gerado. Por exemplo, você pode assinar o evento click
de um botão para fazer com que seu aplicativo faça algo útil quando o usuário clicar no botão.
Para assinar eventos usando o IDE do Visual Studio
Se você não vir a janela Propriedades, no modo de exibição de Design, clique com o botão direito do mouse no formulário ou controle para o qual deseja criar um manipulador de eventos e selecione Propriedades.
Na parte superior da janela Propriedades, clique no ícone Eventos.
Clique duas vezes no evento que deseja criar, por exemplo, o evento
Load
.O Visual C# cria um método de manipulador de eventos vazio e adiciona-o ao código. Como alternativa, você pode adicionar o código manualmente no modo de exibição Código. Por exemplo, as linhas de código a seguir declaram um método de manipulador de eventos que será chamado quando a classe
Form
gerar o eventoLoad
.private void Form1_Load(object sender, System.EventArgs e) { // Add your form load event handling code here. }
A linha de código que é necessária para assinar o evento também é gerada automaticamente no método
InitializeComponent
no arquivo Form1.Designer.cs em seu projeto. Ele é semelhante a isto:this.Load += new System.EventHandler(this.Form1_Load);
Para assinar eventos de forma programática
Defina um método de manipulador de eventos cuja assinatura corresponda à assinatura do delegado do evento. Por exemplo, se o evento se basear no tipo de delegado EventHandler, o código a seguir representará o stub do método:
void HandleCustomEvent(object sender, CustomEventArgs a) { // Do something useful here. }
Use o operador de atribuição de adição (
+=
) para anexar um manipulador de eventos ao evento. No exemplo a seguir, suponha que um objeto chamadopublisher
tem um evento chamadoRaiseCustomEvent
. Observe que a classe do assinante precisa de uma referência à classe do editor para assinar seus eventos.publisher.RaiseCustomEvent += HandleCustomEvent;
Você também pode usar uma expressão lambda para especificar um manipulador de eventos:
public Form1() { InitializeComponent(); this.Click += (s,e) => { MessageBox.Show(((MouseEventArgs)e).Location.ToString()); }; }
Para assinar eventos usando uma função anônima
Se não tiver que cancelar a assinatura de um evento posteriormente, você poderá usar o operador de atribuição de adição (+=
) para anexar uma função anônima como um manipulador de eventos. No exemplo a seguir, suponha que um objeto chamado publisher
tenha um evento chamado RaiseCustomEvent
e que uma classe CustomEventArgs
também tenha sido definida para conter algum tipo de informação de evento específico. Observe que a classe do assinante precisa de uma referência a publisher
para assinar seus eventos.
publisher.RaiseCustomEvent += (object o, CustomEventArgs e) =>
{
string s = o.ToString() + " " + e.ToString();
Console.WriteLine(s);
};
Você não poderá cancelar facilmente a assinatura de um evento se tiver usado uma função anônima para assiná-lo. Para cancelar a assinatura nesse cenário, volte para o código em que você assina o evento, armazene a função anônima em uma variável de delegado e adicione o delegado ao evento. Recomendamos que você não use funções anônimas para assinar eventos se tiver que cancelar a assinatura do evento em algum momento posterior em seu código. Para obter mais informações sobre expressões lambda, consulte Expressão lambda.
Cancelando a assinatura
Para impedir que o manipulador de eventos seja invocado quando o evento for gerado, cancele a assinatura do evento. Para evitar perda de recursos, cancele a assinatura de eventos antes de descartar um objeto de assinante. Até que você cancele a assinatura de um evento, o delegado multicast subjacente ao evento no objeto de publicação terá uma referência ao delegado que encapsula o manipulador de eventos do assinante. Desde que o objeto de publicação contenha essa referência, a coleta de lixo não excluirá seu objeto de assinante.
Para cancelar a assinatura de um evento
Use o operador de atribuição de subtração (
-=
) para cancelar a assinatura de um evento:publisher.RaiseCustomEvent -= HandleCustomEvent;
Quando todos os assinantes tiverem cancelado a assinatura de um evento, a instância do evento na classe do publicador será definida como
null
.