Pourquoi avons-nous besoin de C# délégués
Je n'ai jamais l'air de comprendre pourquoi nous avons besoin de délégués?
Je sais qu'ils sont immuables de référence types qui contiennent de référence d'une méthode, mais pourquoi ne peut-on pas appeler la méthode directement, au lieu de l'appeler par l'intermédiaire d'un délégué?
Grâce
- btw,les délégués sont immuables!
- Désolé, je voulais dire immuable
- édité =).........
- double possible de Où dois-je utiliser des délégués?
Vous devez vous connecter pour publier un commentaire.
Bien sûr, vous pouvez appeler la méthode directement sur l'objet, mais envisager des scénarios suivants:
Select
méthode.Réponse est Simple: le code de devoir effectuer l'action ne connaît pas la méthode à appeler quand c'est écrit. Vous ne pouvez appeler la méthode directement si vous savez au moment de la compilation de la méthode à appeler, non? Donc, si vous voulez abstraction de l'idée de "réaliser une action X au moment opportun" vous avez besoin d'une représentation de l'action, de sorte que la méthode de l'appel à l'action n'a pas besoin de connaître précisément la mise en œuvre d'avance.
Par exemple:
Enumerable.Select
dans LINQ ne pouvez pas savoir la projection que vous souhaitez utiliser sauf si vous lui ditesButton
ne savais pas ce que vous voulez de l'action lorsque l'utilisateur clique sur leIl peut vous aider à penser des délégués comme unique méthode d'interfaces, mais avec beaucoup de syntaxe de la langue pour les rendre faciles à utiliser, et funky de soutien pour l'exécution asynchrone et la multidiffusion.
Parce que vous ne pouvez pas ont la méthode encore écrit, ou que vous avez conçu votre classe de telle manière que l'utilisateur peut choisir la méthode (que l'utilisateur écrit), l'utilisateur veut votre classe à exécuter.
Ils font également de certains modèles plus propres (par exemple, au lieu d'une instruction switch où vous appel à des méthodes différentes, vous appelez le délégué passés) et plus facile à comprendre et à permettre l'extension de votre code sans le modifier (pensez OCP).
Les délégués sont également à la base du concours complet du système de l'écriture et de l'enregistrement des gestionnaires d'événements sans les délégués serait beaucoup plus difficile qu'il est avec eux.
Voir les différents
Action
etFunc
délégués dans Linq - il ne serait guère utile sans eux.Cela dit, personne ne vous oblige à utiliser des délégués.
Tout ce qui peut être fait avec des délégués peut être fait sans eux, mais les délégués de fournir un beaucoup plus propre façon de faire. Si l'on n'a pas les délégués, on aurait à définir une interface ou une classe de base abstraite pour toutes les fonctions possibles de la signature contenant une fonction Invoke(paramètres appropriés), et de définir une classe pour chaque fonction qui devait être appelable par le pseudo-délégués. Cette classe héritent de l'interface appropriée pour la fonction de signature, devrait contenir une référence à la classe contenant la fonction qu'il est censé représenter, et une méthode Invoke(paramètres appropriés), qui ferait appel de la fonction appropriée dans la classe à laquelle elle détient une référence. Si la classe Foo a deux méthodes Toto1 et Foo2, à la fois prendre un seul paramètre, qui peut être appelé par le pseudo-délégués, il y aurait deux classes supplémentaires créés, l'un pour chaque méthode.
Sans prise en charge du compilateur pour cette technique, le code source devrait être assez odieux. Si le compilateur peut générer automatiquement le bon classes imbriquées, cependant, les choses pourraient être assez propre. Envoi de vitesse de pseudo-délégués serait probablement généralement plus lent qu'avec les classiques des délégués, mais si pseudo-délégués ont été d'une interface plutôt qu'une classe de base abstraite, une classe qui a seulement besoin de faire un pseudo-délégué pour une méthode de signature pourrait la mise en place de pseudo-délégué de l'interface elle-même; l'instance de classe peut ensuite être transmis à n'importe quel code attend à une pseudo-délégué de la signature, en évitant la nécessité de créer un objet supplémentaire. En outre, alors que le nombre de classes, il serait nécessaire lors de l'utilisation de pseudo-délégués seraient plus importants que lors de l'utilisation de "vrais" délégués, chaque pseudo-délégué a seulement besoin de tenir d'une seule instance de l'objet.
Pense que le C/C++ pointeurs de fonction, et de la façon dont vous traitez javascript fonctions de gestion d'évènements comme des "données" et de les transmettre autour de. En langage Delphi, il y a également de procédure type.
En coulisses, C# délégué et les expressions lambda, et toutes ces choses sont essentiellement la même idée: code de données. Et ce qui constitue la base de la programmation fonctionnelle.
Vous demandé pourquoi, par exemple, vous voulez passer une fonction en paramètre, j'ai parfait et pensé qu'il pourrait vous aider à comprendre, il est assez académique, mais montre une utilisation. Disons que vous avez un ListResults() la méthode et getFromCache() la méthode. Plutôt que d'avoir beaucoup de contrôle si le cache est nul etc. vous pouvez simplement transmettre une méthode pour getCache et ensuite seulement l'invoquer si le cache est vide à l'intérieur de la getFromCache méthode:
_cacher.GetFromCache(delegate { return ListResults(); }, "ListResults");
Vous pouvez y penser comme à une construction similaire avec des pointeurs de fonctions en C/C++. Mais ils sont plus que cela en C#. Détails.
pointers to funtions in C/C++.
Hehhehehee