c# - macoratti - why use delegate




Delegados: Função de Ação de Predicado (6)

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?


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.

O MethodInvoker é um dos desenvolvedores do WinForms; não aceita argumentos e não retorna nenhum resultado. Ele é anterior à Ação e ainda é usado com frequência quando invocado no thread da interface do usuário, uma vez que BeginInvoke () e outros aceitam um Delegate sem tipo; embora a Ação faça o mesmo.

myForm.BeginInvoke((MethodInvoker)delegate
{
  MessageBox.Show("Hello, world...");
});

Eu também estaria ciente de ThreadStart e ParameterizedThreadStart; mais uma vez a maioria das pessoas irá substituir uma ação nos dias de hoje.


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> .


  • 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.





delegates