c# why Delegados: Função de Ação de Predicado




why use delegate (7)

Ação e Func com lambda:

person p = new person();
Action<int, int> mydel = p.add;       /*(int a, int b) => { Console.WriteLine(a + b); };*/
Func<string, string> mydel1 = p.conc; /*(string s) => { return "hello" + s; };*/
mydel(2, 3);
string s1=  mydel1(" Akhil");
Console.WriteLine(s1);
Console.ReadLine();

Alguém pode fornecer uma boa explicação (espero, com exemplos) destes 3 delegados mais importantes:

  • Predicado
  • Açao
  • Func

Que outros delegados um desenvolvedor de c # deve estar ciente?

Com que frequência você os usa no código de produção?


Um exemplo simples sobre os argumentos e o que retira cada tipo

Este Func pega dois int int e retorna um int.Func sempre tem tipo de retorno

 Func<int, int, int> sum = (a, b) => a + b;
 Console.WriteLine(sum(3, 5));//Print 8

Neste caso, func não tem argumentos, mas retorna uma string

Func<string> print = () => "Hello world";
Console.WriteLine(print());//Print Hello world

Esta ação leva dois argumentos int e retorna vazio

Action<int, int> displayInput = (x, y) => Console.WriteLine("First number is :" + x + " , Second number is "+ y);
displayInput(4, 6); //Print First number is :4 , Second number is :6

Este Predicado recebe um argumento e sempre retorna bool.Geralmente Predicados sempre retornam bool.

Predicate<int> isPositive = (x) => x > 0;
Console.WriteLine(isPositive(5));//Print True

Predicado, Func e Action são instâncias delegadas inerentes do .NET. Cada uma dessas instâncias de delegado pode referir ou apontar para métodos do usuário com assinatura específica.

Delegado de ação - As instâncias de delegação de ação podem apontar para métodos que recebem argumentos e retornam nulos.

Delegado de funções - A instância delegada de funções pode apontar para o (s) método (s) que recebem um número variável de argumentos e retornam algum tipo.

Predicados - Os predicados são semelhantes às instâncias func delegate e podem apontar para métodos que recebem um número variável de argumentos e retornam um tipo de bool.


Action , Func e Predicate todos pertencem à família de delegados.

Action : A ação pode usar n parâmetros de entrada, mas retorna nulo.

Func : Func pode ter n parâmetros de entrada, mas sempre retornará o resultado do tipo fornecido. Func<T1,T2,T3,TResult> , aqui T1, T2, T3 são parâmetros de entrada e TResult é a saída dele.

Predicate : O Predicado também é uma forma de Func, mas sempre retornará bool. Em palavras simples, é um empacotador de Func<T,bool> .


Func é mais amigável ao LINQ, pode ser passado como um parâmetro. (sem pontos)

Predicado não pode, deve ser embrulhado novamente.

Predicate<int> IsPositivePred = i => i > 0;
Func<int,bool> IsPositiveFunc = i => i > 0;

new []{2,-4}.Where(i=>IsPositivePred(i)); //Wrap again

new []{2,-4}.Where(IsPositivePred);  //Compile Error
new []{2,-4}.Where(IsPositiveFunc);  //Func as Parameter

  • Predicate : essencialmente Func<T, bool> ; faz a pergunta "o argumento especificado satisfaz a condição representada pelo delegado?" Usado em coisas como List.FindAll.

  • Action : Execute uma ação considerando os argumentos. Objetivo muito geral. Não é muito usado no LINQ, pois implica efeitos colaterais, basicamente.

  • Func : Usado extensivamente no LINQ, geralmente para transformar o argumento, por exemplo, projetando uma estrutura complexa em uma propriedade.

Outros delegados importantes:

  • EventHandler / EventHandler<T> : usado em todo WinForms

  • Comparison<T> : como IComparer<T> mas em forma de delegado.


Além da resposta de Jon, também há

  • Converter<TInput, TOutput> : É essencialmente Func<TInput, TOutput> , mas com semântica. Usado por List.ConvertAll e Array.ConvertAll, mas pessoalmente não o vi em nenhum outro lugar.






delegates