Partilhar via


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

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

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

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

  1. 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.  
    }  
    
  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 tenha um evento chamado RaiseCustomEvent. 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.

Consulte também