Como se inscrever e cancelar a assinatura de eventos (Guia de Programação em C#)
Você se inscreve em um evento que é publicado por outra classe quando você deseja escrever código personalizado que é chamado quando esse evento é gerado. Por exemplo, você pode se inscrever no evento de click
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 não conseguir ver a janela Propriedades , no modo 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 você deseja criar, por exemplo, o
Load
evento.Visual C# cria um método de manipulador de eventos vazio e adiciona-o ao seu código. Como alternativa, você pode adicionar o código manualmente na Visualização de código . Por exemplo, as seguintes linhas de código declaram um método manipulador de eventos que será chamado quando a
Form
classe gerar oLoad
evento.private void Form1_Load(object sender, System.EventArgs e) { // Add your form load event handling code here. }
A linha de código necessária para se inscrever no evento também é gerada automaticamente no
InitializeComponent
método no arquivo Form1.Designer.cs em seu projeto. Assemelha-se a isto:this.Load += new System.EventHandler(this.Form1_Load);
Para subscrever eventos programaticamente
Defina um método de manipulador de eventos cuja assinatura corresponda à assinatura de representante para o evento. Por exemplo, se o evento for baseado no EventHandler tipo de delegado, o código a seguir representa o stub de 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
tenha um evento chamadoRaiseCustomEvent
. Observe que a classe de assinante precisa de uma referência à classe publisher para se inscrever em 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 subscrever eventos utilizando uma função anónima
Se você não precisar cancelar a assinatura de um evento posteriormente, 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 nomeado publisher
tenha um evento nomeado RaiseCustomEvent
e que uma CustomEventArgs
classe também tenha sido definida para transportar algum tipo de informação de evento especializada. Observe que a classe de assinante precisa de uma referência para publisher
se inscrever em seus eventos.
publisher.RaiseCustomEvent += (object o, CustomEventArgs e) =>
{
string s = o.ToString() + " " + e.ToString();
Console.WriteLine(s);
};
Não pode cancelar facilmente a subscrição de um evento se tiver utilizado uma função anónima para o subscrever. Para cancelar a inscrição nesse cenário, volte para o código onde você se inscreve no evento, armazene a função anônima em uma variável delegada e, em seguida, adicione o delegado ao evento. Recomendamos que não utilize funções anónimas para subscrever eventos se tiver de cancelar a subscrição do evento em algum momento posterior do seu código. Para obter mais informações sobre funções anônimas, consulte Expressões do Lambda.
Cancelar subscrição
Para evitar que o manipulador de eventos seja invocado quando o evento é gerado, cancele a inscrição do evento. Para evitar vazamentos de recursos, você deve cancelar a assinatura de eventos antes de descartar um objeto de assinante. Até que você cancele a assinatura de um evento, o delegado de multicast subjacente ao evento no objeto de publicação tem uma referência ao delegado que encapsula o manipulador de eventos do assinante. Contanto que o objeto de publicação mantenha essa referência, a coleta de lixo não excluirá seu objeto de assinante.
Para cancelar a inscrição em 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 cancelaram a inscrição de um evento, a instância do evento na classe publisher é definida como
null
.