Em tão pouco tempo o delegate evoluiu muito dentro da plataforma .NET. Supondo que temos um delegate que recebe dois números inteiros e retorna um valor, também inteiro, temos as seguintes formas de proceder para executar o delegate nas respectivas versões do .NET até o momento:
delegate int Operacao(int a, int b);
[ Versão 1.x ]
static void Main(string[] args)
{
Operacao op = new Operacao(Soma);
Console.WriteLine(op(2, 4));
}
public static int Soma(int a, int b)
{
return (a + b) * 3;
}
[ Versão 2.0 ]
static void Main(string[] args)
{
Operacao op = new Operacao(delegate(int a, int b)
{
return (a + b) * 3;
});
Console.WriteLine(op(2, 4));
}
[ Versão 3.5 ]
static void Main(string[] args)
{
Operacao op = (a, b) => (a + b) * 3;
Console.WriteLine(op(2, 4));
}
A primeira versão não tem o muito o que comentar. É aquilo e pronto! Já a versão 2.0 do .NET permitiu a criação de métodos anonimos, o que evita de criarmos um método auxiliar (Soma) para vincularmos ao delegate. Já a versão 3.5 vai além. Como podemos notar, especificamos os parametros antes do operador “=>” (e os tipos são inferidos de acordo com a assinatura do delegate). Após esse operador é onde efetivamente colocaremos o código do método.
Isso é usado extensivamente quando utilizamos o Linq. Particularmente, a primeira vista eu também achei um bocado complexo mas praticando (nem que for por brincandeira) voce se adapta rapidamente.