Olá a todos. Hoje vou-vos falar de Delegates e Eventos, o que são e para que servem. Esta é a aplicação que vos disponibilizo para testarem tudo o que aqui vamos falar.
Delegates, são apontadores para funções, ou seja, são funções que nos permitem invocar outras. Eventos, utilizam os delegates para fazer a ponte entre as mensagens da aplicação e as nossas funções.
Os delegates são classes, logo podem ser declarados dentro e foras de uma classe, vai depender do nível de visibilidade que queremos que eles tenham.
Os delegates instanciam-se como todas as classes só que os parâmetros são nomes de uma função. Neste caso estamos a instanciar o delegate testeDelegate que foi definido em cima para a variável “t” que está a apontar para a função de nome “metodo”
Os delegates podem ser chamados também de forma assincrona, ou seja, noutro thread (mais tarde falaremos de multiThreading) o que vai aumentar a performance porque a função é executada em background e caso o processo seja demorado não bloqueia a aplicação.
Usa-se do método BeginInvoke()
Este método leva como parâmetros os parâmetros do delegate uma instância da classe AsyncCallback se quisermos resposta quando o processo termina e também o valor que queremos que nos devolva o AssyncState.
Esta função de callback e utilizada para saber se o processo já terminou, visto não termos essa percepção porque o sistema não o está a executar no UI(User Interface).
- Multicast
Podemos chamar uma ou mais funções por ordem de adição. Para adicionar funções a um delegate utiliza-se o += para retirar é o -=.
Como se vê na figura vão ser executadas as duas funções e vão aparecer duas messageBox.
- Anonymous Delegates
A capacidade de não ser necessário criar um método para o delegate em vez disso é um bloco de código usado como parâmetro do delegate.
Assim evitamos como acontece nas imagens anteriores, de criar uma função para o delegate, escrevemos logo o bloco de código.
Nesta imagem vemos também as lambda expressions uma nova funcionalidade do C# 3.0.
- Eventos
As aplicações desenvolvidas em .NET são “message-based” o que significa que a aplicação comunica com o windows e com ela própria através de mensagens.
O Receiver ou Handler, é quem está á espera do evento(mensagem) – É aqui que os delegates entram em acção.
Sender , será responsável por gerar (Raise) o evento no caso de eventos do rato ou teclado o sender é o .NET runtime.
Nota: o sender não tem conhecimento para quem está a enviar a mensagem, logo utilizam-se os delegates
A assinatura de uma função que recebe o evento é sempre esta sem retorno e como parâmetros um objecto e uma classe derivada de EventArgs
Vamos criar o nosso evento:
Passo 1: declaramos um enveto e um delegate public delegate void NossoEventHandler(object sender, NossoEventArgs e); public event NossoEventHandler DisparaEvento;
Passo 2: Criamos a nossa classe derivada de EventArgs, neste caso só retorna uma string public class NossoEventArgs : EventArgs { public string _texto;
public NossoEventArgs(string texto) { _texto = texto; } }
Passo 3: Definimos o eventHandler (a função que vai receber o evento)
DisparaEvento += new NossoEventHandler(NossoEvento);
(“DisparaEvento” é o nosso evento que recebe o delegate “NossoEventHandler” que aponta para a nossa função “NossoEvento”) 🙂 simples não é?!
Passo 4: Definimos a nossa função que vai servir de Handler, como é um evento que chama a função tem de ter sempre a assinatura objecto e EventArgs.
public void NossoEvento(object sender, NossoEventArgs e) { //Fim do nosso evento com os nossos eventArgs MessageBox.Show(e._texto); }
Passo 5: Chamar o nosso evento DisparaEvento(this, new NossoEventArgs(“Ola”));
(this é o objecto, a nossa classe derivada de EventArgs que leva uma string como parâmetro).
No final ao chamar este evento vamos estar a chamar a nossa função “NossoEvento” e mostramos uma messageBox com o texto “Ola” que passamos no EventArgs.
Bom chegamos ao fim de mais uma sessão, esta foi bem puxada mas quem perceber isto está safo no mundo da programação quem não percebeu tem de praticar e passado alguns dias faz isto com uma perna ás costas.
Obrigado a todos pelo vosso apoio e até para a semana.
PS: Para a semana voltará ao formato de video.