Les délégués, les actions et les fonctions sont tous des types C # axés sur un concept similaire: stocker des références dans une variable à des fonctions et des méthodes, qui peuvent être appelées plus tard pour exécuter la méthode vers laquelle elle pointe. Nous discuterons des différences entre les différents types et de la manière de les utiliser.
Que sont les délégués?
Les délégués sont essentiellement des pointeurs de type sécurisé vers des fonctions. Le délégué n'est que la variable, qui pointe vers une méthode et lui «délègue» l'exécution. La méthode vers laquelle elle pointe peut être nommée, comme une méthode membre de classe, ou anonyme, comme avec les fonctions fléchées.
Les délégués ont deux parties principales: la définition du type et l'implémentation. La définition de type garantit la sécurité du type, donc si vous souhaitez n'accepter qu'une méthode qui prend un chaîne
et renvoie un booléen, vous devrez le définir comme une fonction normale, sauf avec le déléguer
paramètre et pas de code réel.
Ensuite, vous pouvez écrire une implémentation, ou plusieurs implémentations, qui ont les mêmes paramètres de retour et d'entrée, mais qui contiennent en fait du code.
Ensuite, vous pouvez utiliser la définition de délégué comme un paramètre de type, en créant une nouvelle variable qui pointe vers la fonction réelle. Lorsque vous souhaitez appeler le délégué, vous pouvez l'invoquer comme une méthode et lui transmettre les paramètres appropriés. Le runtime .NET examinera la méthode vers laquelle le délégué pointe et invoquera cette méthode.
C'est déjà assez clair où cela est assez utile – si vous avez plusieurs fonctions qui prennent toutes les mêmes paramètres d'entrée mais doivent appeler des versions différentes en fonction, par exemple, d'une énumération d'entrée, vous pouvez attribuer à chaque valeur d'énumération un délégué et l'utiliser plutôt que de dupliquer la logique dans une grande instruction switch.
Les délégués n'ont cependant pas besoin de pointer vers des méthodes nommées, car elles sont beaucoup plus utiles pour pointer vers des fonctions anonymes. Ceux-ci sont créés avec la syntaxe de la fonction de flèche, () => {}
, qui définit une fonction sans nom, d'où «anonyme». Vous pouvez les utiliser comme des délégués ordinaires.
Les actions et les fonctions sont simplement des délégués avec des arguments spécifiques et des paramètres de retour. Les actions peuvent prendre n'importe quel nombre d'arguments mais retourner néant
. Les fonctions peuvent accepter n'importe quelle quantité d'arguments, mais retournent toujours une valeur, définie par le dernier paramètre de type.
Vraiment, ce ne sont que des définitions de délégué prédéfinies avec le type générique T
. Une action
sans aucun type est littéralement juste une définition de délégué vide avec un néant
type de retour.
Vous avez probablement beaucoup utilisé Funcs sans y penser. Ce sont les fonctions que vous transmettez à des requêtes énumérables telles que .Où()
pour sélectionner des éléments. Ces types de Funcs en particulier sont appelés Prédicats, et un Prédicat
est fonctionnellement équivalent à l'écriture Func
. Ils ne sont pas vraiment spéciaux au-delà du nom spécifique.
Vous pouvez en fait définir strictement un Func
, attribuez-lui une fonction comme valeur et transmettez-la à .Où()
, ce qui semble étrangement troublant étant donné que vous faites généralement cela en ligne sans le type ou la définition de variable, mais c'est tout à fait valide:
<img class = "imgchk9 alignnone wp-image-6413 size-full" data-pagespeed-lazy-src = "https://www.cloudsavvyit.com/thumbcache/0/0/225e5856713a40a9725d15c02598b097/p/uploads/2020/08 /22121127.png "alt =" Définir une fonction
Vous pouvez définir strictement Prédicat
plutôt que Func <int, booléen
, mais certaines fonctions voudront spécifiquement l'un ou l'autre, et il n'y a malheureusement pas de conversion implicite entre les deux.
Les délégués ont quelques autres propriétés intéressantes. Comme ce ne sont que des variables, vous pouvez les stocker dans des listes et des dictionnaires comme tout autre type de référence. Vous pouvez parcourir tous les délégués de la liste et appeler chacun d'eux à tour de rôle.
Vous pouvez également multidiffusion délégués, qui est un terme sophistiqué pour dire que vous pouvez les ajouter ensemble. Par exemple, dans l'exemple suivant, un délégué d'accueil est défini, qui prend un nom et salue l'utilisateur. Deux implémentations sont définies, Bonjour
qui dit bonjour, et Au revoir
qui dit au revoir.
Ensuite, vous pouvez littéralement les ajouter avec l'opérateur de signe plus, mais notez que cela attend un délégué, et non un groupe de méthodes, vous devez donc envelopper le nom de la fonction dans nouveau DelegateDefinition ()
pour qu'il fonctionne correctement. Ce délégué combiné exécute les deux éléments dans l'ordre dans lequel ils ont été ajoutés.
Vous pouvez soustraire des délégués, ce qui les supprime de la liste, bien qu'il n'y ait pas d'opérateurs de multiplication pour une raison quelconque, et la division n'aurait aucun sens ici.