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

  1. 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.

  2. Na parte superior da janela Propriedades, clique no ícone Eventos.

  3. 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 evento Load.

    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

  1. 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.  
    }  
    
  2. 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 chamado publisher tem um evento chamado RaiseCustomEvent. 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.

Confira também