Quelqu'un peut-il fournir une bonne explication (avec un peu de chance avec des exemples) de ces 3 délégués les plus importants:
- Prédicat
- action
- Func
Predicate
: essentiellement Func<T, bool>
; pose la question "l'argument spécifié satisfait-il la condition représentée par le délégué?" Utilisé dans des choses comme List.FindAll.
Action
: Effectuez une action en fonction des arguments. Usage très général. Peu utilisé dans LINQ car cela implique des effets secondaires, en gros.
Func
: Utilisé de manière intensive dans LINQ, généralement pour transformer l'argument, par exemple en projetant une structure complexe sur une propriété.
Autres délégués importants:
EventHandler
/ EventHandler<T>
: Utilisé partout dans WinForms
Comparison<T>
: Comme IComparer<T>
mais sous forme de délégué.
System.Converter<TInput, TOutput>
, bien qu'il soit rarement utilisé.EventHandler/EventHandler<T>
apparaissent également partout en dehors de WinForms.Action
,Func
etPredicate
tous appartiennent à la famille des délégués.Action
: L'action peut prendre n paramètres d'entrée mais elle retourne void.Func
: Func peut prendre n paramètres d'entrée mais il retournera toujours le résultat du type fourni.Func<T1,T2,T3,TResult>
, ici T1, T2, T3 sont des paramètres d'entrée et TResult en est la sortie.Predicate
: Predicate est aussi une forme de Func mais il retournera toujours bool. En termes simples, il est enveloppantFunc<T,bool>
.la source
En plus de la réponse de Jon, il y a aussi
Converter<TInput, TOutput>
: C'est essentiellementFunc<TInput, TOutput>
, mais avec la sémantique. Utilisé par List.ConvertAll et Array.ConvertAll, mais personnellement je ne l'ai vu nulle part ailleurs.la source
MethodInvoker est celui que les développeurs WinForms peuvent utiliser; il n'accepte aucun argument et ne renvoie aucun résultat. Il est antérieur à Action, et est encore souvent utilisé lors de l'appel sur le thread d'interface utilisateur puisque BeginInvoke () et al acceptent un Delegate non typé; même si Action fera tout aussi bien.
Je serais également au courant de ThreadStart et ParameterizedThreadStart; encore une fois, la plupart des gens remplaceront une action ces jours-ci.
la source
Predicate, Func et Action sont des instances de délégué intégrées de .NET. Chacune de ces instances de délégué peut faire référence ou pointer vers des méthodes utilisateur avec une signature spécifique.
Délégué d'action - Les instances de délégué d'action peuvent pointer vers des méthodes qui acceptent des arguments et retournent void.
Délégué Func - L'instance de délégué Func peut pointer vers des méthodes prenant un nombre variable d'arguments et renvoyant un type.
Prédicat - Les prédicats sont similaires aux instances de délégué func et peuvent pointer vers des méthodes qui acceptent un nombre variable d'arguments et renvoient un type booléen.
la source
Action et Func avec lambda:
la source
Func est plus convivial pour LINQ, peut être passé en paramètre. (sans point)
Le prédicat ne peut pas, doit être encapsulé à nouveau.
la source
Un exemple simple sur les arguments et ce que retutn chaque type
Cette Func prend deux arguments int et retourne un int.Func a toujours un type de retour
Dans ce cas, func n'a pas d'arguments mais renvoie une chaîne
Cette action prend deux arguments int et renvoie void
Ce prédicat prend un argument et renvoie toujours bool. En général, les prédicats renvoient toujours bool.
la source