Délégués: Action de prédicat Func

Quelqu’un peut-il fournir une bonne explication (avec des exemples, espérons-le) de ces trois delegates les plus importants:

  • Prédicat
  • action
  • Func

Quels autres delegates un développeur C # devrait-il connaître?

À quelle fréquence les utilisez-vous dans le code de production?

  • Predicate : essentiellement Func ; pose la question “est-ce que l’argument spécifié satisfait à 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. Pas beaucoup utilisé dans LINQ car cela implique des effets secondaires, en gros.

  • Func : largement utilisé dans LINQ, généralement pour transformer l’argument, par exemple en projetant une structure complexe sur une propriété.

Autres delegates importants:

  • EventHandler / EventHandler : utilisé partout dans WinForms

  • Comparison : Comme IComparer mais sous forme de délégué.

Action , Func et Predicate appartiennent tous à la famille des delegates.

Action : L’action peut prendre n parameters d’entrée mais elle retourne un vide.

Func : Func peut prendre n parameters d’entrée mais il retournera toujours le résultat du type fourni. Func , ici T1, T2, T3 sont des parameters d’entrée et TResult en est la sortie.

Predicate : Predicate est aussi une forme de Func mais il renverra toujours bool. En termes simples, il s’agit d’une enveloppe de Func .

En plus de la réponse de Jon, il y a aussi

  • Converter : Il s’agit essentiellement de Func , mais avec une sémantique. Utilisé par List.ConvertAll et Array.ConvertAll, mais ne l’a pas vu ailleurs.

MethodInvoker est un outil 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 toujours utilisé lors de l’appel sur le thread d’interface utilisateur, car BeginInvoke () et autres acceptent un délégué non typé; bien que l’action soit tout aussi efficace.

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

Je serais également au courant de ThreadStart et ParameterizedThreadStart; encore une fois, la plupart des gens substitueront une action ces jours-ci.

Predicate, Func et Action sont des instances de délégation 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.

Action delegate – Les instances de délégué d’action peuvent pointer vers des méthodes qui prennent des arguments et renvoient un void.

Délégué Func – L’instance de délégué Func peut désigner une ou plusieurs méthodes prenant un nombre variable d’arguments et renvoyant un type.

Prédicat – Les prédicats sont similaires aux instances déléguées de func et ils pourraient pointer vers des méthodes qui prennent un nombre variable d’arguments et renvoient un type bool.

Les autres ont déjà mentionné les utilisations correctes des delegates spécifiques, mais j’aimerais append quelque chose qui complètera leurs réponses. Les noms Func, Action, Predicate ont un arrière-plan mathématique. Pour garder les choses simples, je donnerai une définition informelle d’une fonction mathématique comme celle-ci:

Une fonction est une relation entre des ensembles. Nous prenons un membre d’un ensemble et l’utilisons comme une entrée et la fonction associe cette entrée à un seul membre de l’autre ensemble. En d’autres termes, quelque chose reçoit des entrées et produit des résultats.

Encore une fois, de manière informelle, un prédicat mathématique est une instruction qui peut être vraie ou fausse selon ses variables. Comme d’autres l’ont mentionné, une fonction renvoie booléen.

Et enfin, l’action est une fonction vide (ou le nom plus mathématiquement correct – méthode ou procédure nulle)

Action et Func avec lambda:

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

Func est plus compatible LINQ, peut être passé en paramètre.

Le prédicat ne peut pas, doit être réemballé.

 Predicate IsPositivePred = i => i > 0; Func IsPositiveFunc = i => i > 0; new []{2,-4}.Where(i=>IsPositivePred(i)); //Wrap again new []{2,-4}.Where(IsPositivePred); //Comstack Error new []{2,-4}.Where(IsPositiveFunc); //Func as Parameter