O que são Delegates (C#)? – parte 1

Olá pessoal.

Observei a necessidade de explicar melhor o uso de alguns recursos do C# que aparentemente são taxados como “muito complexos”. Neste momento, vou falar sobre delegates. Para não ficar muito complexo, dividi o assunto em 3 partes. Ao longo dos posts vamos aprender mais sobre esses recursos interessantíssimos e melhorar ainda mais nosso trabalho no dia a dia. Então, vamos ao estudo! 😀

Vamos aprender um pouco sobre os famosos Delegates. Os delegates, basicamente, são tipos da linguagem c# que permitem que façamos uma referência para métodos. Parece complexo, mas vamos entender o que significa isso de uma forma mais simples. Observem a ilustração abaixo:

O que são Delegates? Declaração de Variável

Declaração de Variável

No exemplo, podemos ver a simplicidade de uma declaração de variável e o que acontece na memória. Declaramos uma variável do tipo “int” e então atribuímos o valor 10. Para esta variável é criado um endereço de memória que conterá o valor 10 e este endereço de memória aponta para a variável de nome “minhaVariável”.

Muito interessante, sei como funciona a declaração de variáveis, qual a relação com os delegates? Calma, chegaremos lá.

Uma variável inteira aceita inteiros, um delegate aceita métodos. Isso quer dizer que podemos guardar em nossos delegates métodos. E com isso podemos executá-los no momento que desejarmos, em tempo de execução.

Vamos verificar a sintaxe da declaração de um delegate:

<Modificador de acesso> <Tipo de Retorno> delegate <Nome do Delegate>([Parametros]);

A declaração de um delegate, assemelha-se muito a uma assinatura de um método, com exceção da palavra-chave “delegate”.

Vamos ver maiores detalhes sobre a declaração do delegate:

  • Modificador de acesso:
    • public, protected, private – mas é interessante que seja public
  • Tipo de Retorno:
    • Qualquer tipo de retorno que desejamos para obter algum resultado com a necessidade. Pode ser algum tipo específico como classes, structs, tipos primitivos, etc.
  • delegate:
    • palavra-chave necessária para se declarar um delegate;
  • Nome do delegate:
    • Nome que irá representar o seu delegate. Eu costume nomeá-lo com um sufixo “Handler”. Exemplo. ClickHandler.
  • Parâmetros:
    • Opcional, mas caso necessário, parâmetros podem ser adicionados à assinatura do seu delegate.

Ao declarar um delegate, temos um novo tipo de “dados” que possibilita guardar referências de métodos com a mesma assinatura.

Vejamos um exemplo:

public void delegate AposExecutarCalculo();

Neste exemplo criamos um delegate que não retorna nenhum valor e tem uma assinatura que não necessita de parâmetros. Neste momento, criamos um novo “tipo” que poderá conter métodos que não retornam valores e não necessitam de parâmetros.

Vamos declarar uma variável do tipo delegate criado:

public AposExecutarCalculo meuDelegate;

Se parece muito com uma declaração simples de uma variável inteira, não parece?
Esta variável aceita qualquer tipo de valor? Não. Somente métodos que possuem a mesma assinatura do delegate.

Agora, vamos fazer um exemplo de atribuição de métodos para o nosso delegate:

1 – criar um método:

public void ImprimirInformacao()
{
Console.WriteLine(“Terminou a execução do processo”);
}

2 – Associar ao delegate:

meuDelegate += new AposExecutarCalculo(ImprimirInformacao);

Pronto.

Simples não?
Agora o nosso delegate aponta para um método, no caso ImprimirInformacao. Com isso é possível executar o método a qualquer momento. Podemos observar também o operador “+=”. Ele é utilizado para associar 1 ou mais métodos ao meu delegate. Isso é maravilhoso porque com isso podemos fazer com que apenas 1 chamada ao nosso delegate execute todos os métodos associados a ele. Existe também a possibilidade de utilização do operador “-=” que nos permite desvincular algum método do delegate.

Como executar o método ImprimirInformacao a partir do meu delegate?

Simples:

meuDelegate(); //Executando o método

Olha, que interessante, utilizei o meu delegate como se fosse um método. Legal de mais né? Isso acontece porque o delegate aponta para o endereço de memória que está localizado nosso método ImprimirInformacao. Como o método ImprimirInformacao possui a mesma assinatura do nosso delegate, então, efetuar a chamada da nossa “variável especial” como um método é como se estivéssemos chamando o ImprimirInformacao, só que com um apelido.

Se observarmos, notamos que a forma de declaração de uma “variável” do tipo delegate assemelha-se e muito à declaração de uma variável do tipo inteiro, conforme nosso exemplo. Também o fato de que os métodos atribuídos ao delegate devem possuir a mesma assinatura é bem parecido com o exemplo do tipo inteiro. Agora sabemos que o delegate não é amais mistério certo?

Bom pessoal, terminamos por aqui. No próximo post vamos continuar a utilizar o delegate em exemplos mais práticos e também estudaremos um pouco mais sobre suas características e benefícios, bem como sua utilização com eventos.

Obrigado a todos e até o próximo post.

Posts Relacionados

HTTPS e Requisições Ajax Olá Pessoal, Ultimamente nos deparamos com um problema interessante. Tínhamos uma aplicação web com alguns casos de uso com uma quantidade grande d...
Executando um ping dentro de um programa em C/C++ Algumas pessoas têm me perguntado porque não coloco posts para a linguagem C e C++, visto que, muitos dispositivos embarcados possuem programas em C e...
Aplicativos que não podem faltar no celular de um ... Diversas pessoas me perguntam quais são os melhores aplicativos que possuo em meu celular para administração dos meus produtos android embarcados ou k...
Tratamento de exceções em C# No C# nós temos a possibilidade de fazer vários "catchs" para tratarmos tipos diferentes de exceções. Tais exceções são tratadas do exception mais esp...

10 Comments

  • Gilmar Junior Posted 01/11/2012 15:37

    Boa Tarde, estou começando na area da programação e Post me ajudou muito a ter uma noção do que é Delegate, não vejo a hora de sair o 2 post 😀

    • Albert Tanure Posted 12/11/2012 18:07

      Gilmar Junior. Muito Obrigado pelo seu comentário. Esta semana enviarei a segunda postagem, finalmente.

      Continue contribuindo com seus comentários.

  • Augusto Posted 07/12/2012 23:43

    Ja li muito sobre delegate mas confesso que a sua didática ‘e bastante detalhada e muito compreensível. Eu custo dizer que alguns nunca deveriam explicar determinados assuntos porque fazem eles parecer mais difíceis e assim confundem mais, ao contrario de ajudarem…! Cara você ‘e muito claro e explicito. Parabéns.

    Mas uma pergunta que incomoda: qual ‘e a importância dos delegares?

    • Albert Tanure Posted 07/01/2013 10:15

      Augusto, bom dia.

      Muito obrigado pelo seu feedback e sempre estou disposto a melhorar e ajudar. Obrigado mesmo e sempre estarei disponível. Bom, em resposta ao seu comentário, por favor, de uma lida em um comentário logo abaixo para o André. Talvez responda sua pergunta, qualquer coisa estou à disposição.

      Obrigado

  • André Posted 25/12/2012 18:37

    Velhão obrigado pela explicação porém eu não entendi qual a ultilidade disso

    • Albert Tanure Posted 07/01/2013 10:11

      André, obrigado por seu comentário.

      Os delegates são mais úteis do que imagina. Praticamente na maioria de suas páginas asp.net você os utiliza quando está programando com Webforms. Um clique de um botão utiliza um delegates, um grid, ao desenhar cada um dos itens utliza um delegate. Isso é importante porque podemos desenvolver componentes reutilizáveis e ainda personalizá-los através de eventos onde o desenvolvedor tem a liberdade de “melhorar” a solução no ponto desejado. Delegates vão muito além de eventos, mas isso é história para outros artigos. Espero ter ajudado. Qualquer dúvida, só comentar que terei o prazer em respondê-lo.

      Obrigado

  • Augusto Posted 31/07/2013 22:45

    Show de bola

  • Gedean Joseph Posted 27/08/2013 10:39

    Olá amigo, gostaria de agradecer pelo seu post. Uma vez li: “O céu se abre toda vez que um ser iluminado consegue criar uma explicação clara e objetiva como esse post”. Achei muito engraçado esse comentário e acredito que seja esse o caso desse posto rs.

    Cara, vou procurar os outros, sempre brinco dizendo aqui no trampo que falar de delegates é invocar o mal, com essa explicação e tenho certeza que com o complemento das outras me convencerei de que delegate é “coisa linda de Deus.” Rs

    vlw grande abraço!

    • Albert Posted 02/09/2013 16:04

      Gedean Joseph, muito obrigado por seu comentário. Fique a vontade para enviar quaisquer dúvidas que estarei a disposição. Tenho um site, http://www.alberttanure.com, e sempre posto algumas novidades. Irei postar mais assuntos sobre delegates e inclusive vou escrever um artigo dando continuidade sobre este assunto em meu site.

      Aguardo suas dúvidas e sugestões.

      Obrigado

  • petron Posted 23/10/2013 18:16

    Muito obrigado ajudou demais. aguardando a parte 2.

Add Comment

Your email address will not be published. Required fields are marked *

Phone: (31) 3646-1612
Fax: (31) 3646-1614
Loja 01, Lourdes, Belo Horizonte/MG
Rua Rio de Janeiro, 1278