Alguém pode fornecer uma boa explicação (com exemplos) dos três delegados mais importantes:
- Predicado
- Açao
- Func
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 de acordo com os argumentos. Finalidade 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 o WinForms
Comparison<T>
: Como, IComparer<T>
mas na forma de delegado.
System.Converter<TInput, TOutput>
, embora raramente seja usado.EventHandler/EventHandler<T>
também aparecerão fora do WinForms.Action
,Func
ePredicate
todos pertencem à família delegada.Action
: A ação pode aceitar n parâmetros de entrada, mas retorna nulo.Func
: Func pode receber 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
: Predicado também é uma forma de Func, mas sempre retornará bool. Em palavras simples, é invólucroFunc<T,bool>
.fonte
Além da resposta de Jon, também há
Converter<TInput, TOutput>
: É essencialmenteFunc<TInput, TOutput>
, mas com semântica. Usado por List.ConvertAll e Array.ConvertAll, mas pessoalmente não o vi em nenhum outro lugar.fonte
O MethodInvoker é aquele que os desenvolvedores do WinForms podem usar; não aceita argumentos e não retorna resultados. Ele antecede a Ação e ainda é frequentemente usado ao invocar o thread da interface do usuário, pois BeginInvoke () et al aceitam um Delegado não digitado; embora a ação faça o mesmo.
Eu também estaria ciente de ThreadStart e ParameterizedThreadStart; novamente, a maioria das pessoas substitui uma ação nos dias de hoje.
fonte
Predicate, Func e Action são instâncias delegadas incorporadas do .NET. Cada uma dessas instâncias delegadas pode se referir ou apontar para métodos de usuário com assinatura específica.
Delegado de ação - As instâncias de delegado de ação podem apontar para métodos que recebem argumentos e retornos nulos.
Delegado do Func - a instância do delegado do Func pode apontar para métodos que recebem um número variável de argumentos e retornam algum tipo.
Predicado - Predicados são semelhantes às funções de delegação de funções e podem apontar para métodos que recebem um número variável de argumentos e retornam um tipo de bool.
fonte
Ação e Func com lambda:
fonte
Func é mais compatível com LINQ, pode ser passado como um parâmetro. (sem ponto)
Predicado não pode, tem que ser embrulhado novamente.
fonte
Um exemplo simples sobre os argumentos e o que retutn cada tipo
Este Func recebe dois argumentos int e retorna um int.Func sempre tem o tipo de retorno
Nesse caso, func não possui argumentos, mas retorna uma string
Esta ação pega dois argumentos int e retorna nulo
Este Predicado aceita um argumento e sempre retorna bool.Geralmente Predicados sempre retornam bool.
fonte