}Da mesma maneira, para instanciar IntSemParametros, o codigo e este: var funcao = new IntSemParametros(FuncaoQueRetornaInt); escreve(funcao().ToString());Para finalizar vamos criar dois metodos compativeis com a assinatura do ultimo delegate, identificado como IntComParametros: public int Soma(int x, int y) { return x + y; } public int Multiplica(int x, int y){ return x * y; }Vamos inicializar IntComParametros primeiro apontando para o metodo Soma, executa-lo, e depois vamos alterar o delegate para que aponte para o metodo Multiplica: var calculadora = new IntComParametros(Soma); var resultadoSoma = calculadora(3,3); Console.WriteLine("Soma: {0}", resultadoSoma); calculadora = Multiplica; //mudou a referencia para outro metodo var resultadoMultiplicacao = calculadora(3,3); Console.WriteLine("Multiplicacao: {0}", resultadoMultiplicacao);Encontramos neste utlimo exemplo um caso de uso real para a utilizacao de delegates. Imagine uma aplicacao do tipo calculadora. O usuario troca a operacao (soma, multiplicacao, divisao, etc) e trocamos o metodo referenciado pelo delegate, retornando resultados diferentes.ActionDisponibilizado no .NET 3.5, amplamente utilizado em sintaxe LINQ e em expressoes Lambda, Action nada mais e que um delegate com a seguinte assinatura: public delegate void Action();O .NET Framework possui previamente ja definidos uma serie de delegates/Actions com parametros genericos para suportar LINQ: Action<T>, Action<T1,T2>, Action<T1, T2, T3>, Action<T1, T2, T3, T4>, etc. public delegate void Action<T>(T parametro); public delegate void Action<T1, T2>(T param1, T2 param2); public delegate void Action<T1, T2, T3>(T param1, T2 param2, T3 param3);//etc...Cada "T" representa um tipo de parametro que o metodo deve possuir. Por exemplo, Action<string> corresponde a um delegate do tipo void com um parametro string. Action<string, int> corresponde a um delegate do tipo void que recebe dois parametros: string, int. De forma generica, podemos utilizar esses delegates sem a necessidade de declarar delegates especificos. Vejamos alguns exemplos: /* Action e um delegate semelhante ao VoidSemParametros */ var action = new Action(MetodoSemParametros); Console.WriteLine(action.Method.Name); /* Action<T> e um delegate semelhante ao VoidComParametros se T for do tipo String */ Action<string> actEscreve = Escreve; actEscreve("Escrito via Action<string>");Func<TResult>Semelhantes a Action's, exceto pelo fato de que possuem retorno do tipo <TResult>. A assinatura do delegate Func<TResult> e a seguinte: public delegate TResult Func<out TResult>();Do mesmo modo que Actions possuem diversas implementacoes disponiveis no .NET Framework, Func's tambem. Um detalhe importante e que o ultimo parametro e sempre o tipo generico de retorno que o metodo deve possuir em sua assinatura. public delegate TResult Func<T, out TResult>(T parametro); public delegate TResult Func<T1, T2, out TResult>(T1 param1, T2 param2 ); public delegate TResult Func<T1, T2, T3, out TResult>(T1 param1, T2 param2, T3 param3); //etc.Veja algumas maneiras de utilizar Func: Func<int> funqInt = FuncaoQueRetornaInt; Console.WriteLine("Func<int>: {0}", funqInt()); Func<int> funqLambda = () => { return FuncaoQueRetornaInt(); }; Console.WriteLine("Lambda: {0}", funqLambda()); Func<int, int, int> funqParameters = Soma; Console.WriteLine("funqParameters: {0}", funqParameters(2, 3)); funqParameters = Multiplica; Console.WriteLine("funqParameters: {0}", funqParameters(2, 3));EventosDelegates sao utilizados na implementacao de eventos em aplicacoes .NET. Num proximo post, mostrarei como criar e implementar seus proprios eventos.LINQA partir da versao .NET 3.5, com o advento do LINQ, delegates (na forma de Actions e Func's) sao amplamente utilizados.ResumoNeste post, apresentei como declarar e utilizar delegates. E importante notar que a partir do .NET 3.5, com o advento do LINQ, foi disponibilizado os delegates