Olá pessoal, neste artigo veremos os conceitos e exemplos dos Eventos da linguagem C#. Acompanhem:

 Introdução – Evento é uma mensagem que uma classe dispara em uma situação determinada. Como visto no artigo anterior, os eventos usam delegates para armazenar endereços de métodos.

 Confira alguns exemplos práticos de uso com eventos:

·         Aplicação Web – Comunica ao aplicativo que algum acesso foi feito em uma aplicação;

·         Timer – Comunica a outros objetos sobre a expiração de um período de tempo;

·         Botão – Comunica a um objeto de formulário que alguém clicou no botão;

·         Domínio de Aplicação – Comunica a uma aplicação a respeito de um evento não-controlado.

 Podemos assumir como válido também o conceito que os eventos são, literalmente, qualquer coisa de valor que tem como finalidade avisar alguém sobre algo. Existem também os eventos públicos, privados e protegidos. O primeiro é exposto como membro público de uma classe editora (assim chamada a classe que disponibiliza um evento), como uma classe button, por exemplo; os dois últimos, privados e protegidos, são usados dentro do campo da classe derivada ou da classe que contém a classe button.

 Importante destacar que qualquer objeto ou classe interessado em um evento pode efetuar a “inscrição”. Para isto, basta que os assinantes (assim chamadas as classes que se inscrevem em um evento) enviem um delegate. Importante também dizer que os eventos podem ter vários assinantes.

 Com relação a função, trata-se da resposta do assinante ao evento. Assim que o evento acontece, o editor é responsável por chamar a função, permitindo que o assinante tenha uma oportunidade de responder. Podemos concluir então, que, por este motivo, a função recebe o nome de event handler. Um dispositivo poderia divulgar um evento de desligamento onde várias aplicações tem o interesse de serem notificadas e responder, por exemplo.

 Divulgando um Evento – As classes definem eventos através da palavra-chave event. Um evento sempre está relacionado a um delegate, e o .NET Framework disponibiliza um delegate padrão, para o tratamento de eventos, chamado EventHandler, sua assinatura é a seguinte:

void NomedoMetodo(object nome, EventArgs outroNome)

 Quando, por exemplo, damos um duplo clique em um botão de um Windows Form, por exemplo, o Visual Studio cria um método com o nome do botão, um underline (sublinhado) e o nome do evento, como abaixo:

private void button1_Click(object sender, EventArgs e)

 Para definirmos um evento em uma classe, recomenda-se usar o delegate padrão EventHandler a menos que o evento contenha informações adicionais que sejam relevantes para os assinantes.

 Veja a sintaxe para definir um evento:

Modificador_de_Acesso event Nome_do_Delegate Nome_do_Evento

 

 Onde:

·         Nome_do_Delegate – Refere-se ao delegate oculto do evento, o qual determina a assinatura do evento;

·         Nome_do_Evento – Refere-se à identidade do evento.

 Por exemplo:

public event System.EventHandler LoginIncorreto;

 Se no método abaixo, por exemplo, o login for incorreto e a classe desejar disparar o evento criado acima, a sintaxe ficará da seguinte forma:

public void ValidarLogin(string login)

        {

            if (login != "wbalbo")

            {

                if (LoginIncorreto != null)

                {

                    LoginIncorreto(this, new EventArgs());

                }

            }

        }

 Note que é necessário verificar se o objeto assinante do evento definiu um método para este evento. Veremos agora como um assinante se “inscreve” em um evento.

 Subscrevendo um Evento – A relação entre editor e assinante pode ser compreendida como sendo uma relação de “um para todos”, em que para cada editor pode haver zero ou mais assinantes. Por outro lado, um assinante tem a possibilidade de subscrever para vários events.

 Por exemplo, um formulário pode subscrever para um clique de botão e um event de mudança de texto, enquanto que os assinantes, para se inscrever para um event, adicionam um delegate ao event. Lembrando que o delegate é o elo para a função ser chamada quando o event for promovido.

 Para subscrever um evento, usamos o método add ou o operador de atribuição +=. Da mesma forma, para cancelarmos uma inscrição a um delegate, basta usarmos o operador -=.

 No exemplo abaixo, a variável objSeguranca define um objeto e se inscreve no evento LoginIncorreto (note a presença das duas classes para melhor entendimento):

class TesteUm

        {

            public event System.EventHandler LoginIncorreto;

 

            public void ValidarLogin(string login)

            {

                if (login != "wbalbo")

                {

                    if (LoginIncorreto != null)

                    {

                        LoginIncorreto(this, new EventArgs());

                    }

                }

            }

        }

 

        class TesteDois

        {

            private TesteUm objTesteUm = new TesteUm();

 

            //Construtor

            public TesteDois()

            {

                objTesteUm.LoginIncorreto += new EventHandler(objTesteUm_LoginIncorreto);  

            }

 

            //Método com a mesma assinatura do delegate EventHandler

            void objTesteUm_LoginIncorreto(object sender, EventArgs e)

            {

                Console.WriteLine("Seu login está errado, tente novamente!");

            }

 

            //Um método qualquer que chama o método ValidarLogin, que por sua vez dispara o evento LoginIncorreto

            void OutroMetodo()

            {

                objTesteUm.ValidarLogin("wbalbo");

            }

        }

 Ressaltando que todo o processo mostrado acima é feito automaticamente pelo Visual Studio quando o usuário efetua um duplo-clique em um botão de um form ou qualquer outro objeto, por exemplo.

 Fonte de Consulta: Apostila de C#, da Impacta Tecnologia.

 Assim finalizo o artigo. Na próxima e última parte veremos os conceitos dos Generics e seus Tipos, não percam!

 Um abraço, e até o próximo artigo.

 Wellington Balbo de Camargo

 wellingtonbalbo@gmail.com