Vamos direto ao ponto: a melhor maneira de aprender a usar uma nova funcionalidade de sua linguagem de programação favorita é identificá-la em um uso do dia a dia. Vamos então utilizar um problema, identificar a situação ao qual o delegate seria útil e vamos mostrar o uso para melhorar a qualidade do seu código.
Mas existe uma outra forma também, que seria fazer um algorítimo recursivo. Mais ou menos como abaixo.
O resultado neste caso não muda. O problema é se quisermos mostrar os dois resultados juntos. Olha como ficaria o nosso método Main.
Código repetido. Argh! Bons programadores não fazem isto.
A única diferença entre os dois blocos é somente o método chamado. E se a gente pudesse aproveitar todo o código e só trocar o nome do método dinamicamente, como se fosse uma variável? Podemos. Isto é C#. É aí que entra o FUNC.
A melhor definição que encontro quando converso sobre ele é que é uma forma de tratar métodos como se fossem variáveis. Veja a sintaxe:
Como todo método em C# possui apenas um retorno, ele sempre será o último tipo mencionado. Trazendo para a nossa realidade, teremos, para os métodos de fatoriais:
Existe um algorítimo que todo aspirante a programador tem que aprender para firmar o conhecimento no uso de iterações que é o algorítimo do Fatorial. Basicamente, o objetivo é descobrir qual seria o fatorial do número 3, por exemplo,
Fat3 = 3 * 2 * 1 = 6.
Uma das formas de desenvolver isto no C#, em uma Console Application, é fazer um laço decremental sempre multiplicando o valor resultante pelo número que está no laço. Por exemplo:
Mas existe uma outra forma também, que seria fazer um algorítimo recursivo. Mais ou menos como abaixo.
O resultado neste caso não muda. O problema é se quisermos mostrar os dois resultados juntos. Olha como ficaria o nosso método Main.
Código repetido. Argh! Bons programadores não fazem isto.
A única diferença entre os dois blocos é somente o método chamado. E se a gente pudesse aproveitar todo o código e só trocar o nome do método dinamicamente, como se fosse uma variável? Podemos. Isto é C#. É aí que entra o FUNC.
A melhor definição que encontro quando converso sobre ele é que é uma forma de tratar métodos como se fossem variáveis. Veja a sintaxe:
FUNC<[tipo parametro1], [tipo parametro2], ..., [tipo parametro n], [retorno]> [nome da função]
Como todo método em C# possui apenas um retorno, ele sempre será o último tipo mencionado. Trazendo para a nossa realidade, teremos, para os métodos de fatoriais:
- Um parâmetro do tipo INTEIRO e
- Uma saída do tipo LONG
FUNC<int, long> fatorial
Transformando isto em um método, temos
Onde o primeiro parâmetro é uma função. Mas não complique, só pense que é um parâmetro que você pode executar como um método, exatamente como fizemos. Assim, qualquer método em toda a nossa aplicação que receba um único inteiro e retorne um long pode ser passado como parâmetro, exatamente como abaixo.
Ficou melhor não? Então, se quisermos agora contar o tempo, é só modificar em um único canto, como no exemplo abaixo:
O ACTION é exatamente como o FUNC, mas ele não tem retorno. Ótimo para métodos com retorno VOID.
E o delegate você usará quando quiser definir métodos "no quente", ou seja, na hora de chamar a função, como abaixo.
O importante, como sempre digo, é mostrar o funcionamento para que o conhecimento fique impregnado. Qualquer dúvida, gentileza entrar em contato.


Comentários
Postar um comentário