161 votes

Délégués : Prédicat, action et fonction

Quelqu'un peut-il fournir une bonne explication (avec des exemples, si possible) de ces 3 délégués les plus importants ?

  • Prédicat
  • Action
  • Func

198voto

Jon Skeet Points 692016
  • 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 : Effectuer une action en fonction des arguments. Usage très général. Pas beaucoup utilisé dans LINQ car il implique des effets de bord, fondamentalement.

  • Func : Occasion de manière extensive dans LINQ, généralement pour transformer l'argument, par exemple en projetant une structure complexe sur une seule 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égation.

3 votes

Il y a aussi System.Converter<TInput, TOutput> bien qu'il soit rarement utilisé.

4 votes

Le convertisseur est un délégué utile lorsqu'il est nécessaire de convertir de nombreux modèles en classes d'entreprise, c'est-à-dire stum.de/2009/12/23/

0 votes

EventHandler/EventHandler<T> apparaissent également partout en dehors de WinForms.

72voto

Rahul Garg Points 1

Action , Func y Predicate appartiennent tous à 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> où T1, T2, T3 sont des paramètres d'entrée et TResult est la sortie de ce système.

Predicate : Predicate est aussi une forme de Func mais il retournera toujours un bool. En termes simples, il s'agit d'une enveloppe de Func<T,bool> .

10voto

G-Wiz Points 4800

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

  • Converter<TInput, TOutput> : C'est essentiellement Func<TInput, TOutput> mais avec de la sémantique. Utilisé par List.ConvertAll et Array.ConvertAll, mais personnellement je ne l'ai vu nulle part ailleurs.

9voto

dimath Points 383

Un exemple simple sur les arguments et le retour de chaque type.

Ce Func prend deux arguments int et retourne un int.Func a toujours un type de retour

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

Dans ce cas, func n'a pas d'arguments mais retourne une chaîne de caractères.

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

Cette action prend deux arguments int et retourne void

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

Ce prédicat prend un argument et renvoie toujours un bool.généralement les prédicats renvoient toujours un bool.

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

4voto

El Zorko Points 1574

MethodInvoker est une méthode que les développeurs WinForms peuvent utiliser ; elle n'accepte aucun argument et ne renvoie aucun résultat. Il est antérieur à Action, et est encore souvent utilisé pour invoquer le thread de l'interface utilisateur puisque BeginInvoke() et al acceptent un Delegate non typé ; bien que Action fasse tout aussi bien l'affaire.

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

Je suis également conscient de l'existence de ThreadStart et de ParameterizedThreadStart ; là encore, la plupart des gens substituent une Action de nos jours.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X