Avantages de l'utilisation de délégués?
Je suis à la recherche d'implémenter le pattern observer dans VB.NET ou C# ou certains autres de première classe .NET de la langue. J'ai entendu dire que les délégués peuvent être utilisés pour cela, mais ne peut pas comprendre pourquoi ils seraient préférables anciennes interfaces mises en œuvre sur les observateurs. Donc,
- Pourquoi devrais-je utiliser les délégués au lieu de définir mes propres interfaces et en passant autour des références à des objets de leur mise en œuvre?
- Pourquoi je veux l'éviter à l'aide de délégués, et aller avec un bon ol'-fashioned interfaces?
Demandez-vous une justification pour la programmation fonctionnelle, ou demandez-vous pourquoi un "délégué" de type est nécessaire en C# pour faire de la programmation fonctionnelle?
Pouvez-vous donner un exemple d'une situation où vous avez ce doute? Je ne suis pas sûr de comprendre ce que vous demandez.
double possible de les délégués à ne pas juste abréviation interfaces?
Pouvez-vous donner un exemple d'une situation où vous avez ce doute? Je ne suis pas sûr de comprendre ce que vous demandez.
double possible de les délégués à ne pas juste abréviation interfaces?
OriginalL'auteur | 2008-11-19
Vous devez vous connecter pour publier un commentaire.
Quand vous pouvez directement appeler une méthode, vous ne pas besoin d'un délégué.
Un délégué est utile lorsque le code de l'appel de la méthode ne sais pas/soin de ce que la méthode qu'il appelle est -- par exemple, vous pouvez invoquer un travail de longue haleine et lui passer un délégué à une méthode de rappel que la tâche peut utiliser pour envoyer des notifications à propos de son statut.
Voici un (très bête) exemple de code:
Comme vous pouvez le voir, le
Task
classe ne sais pas ou des soins -- dans ce cas, le délégué est une méthode qui imprime l'état de la tâche de la console. La méthode pourrait tout aussi bien envoyer l'état d'une connexion réseau à un autre ordinateur. Etc.OriginalL'auteur Ben M
Vous êtes un O/S, et je suis d'une application. Je veux vous dire d'appeler un de mes méthodes lorsque vous détectez quelque chose qui se passe. Pour ce faire, je vous passer un délégué à la méthode de la mine, qui, je veux vous appeler. Je ne dis pas que la méthode de la mine de moi-même, parce que je veux vous appeler lorsque vous détectez quelque chose. Vous n'appelez pas ma méthode directement parce que vous ne savez pas (au moment de la compilation) que la méthode existe (je n'ai même pas écrit lorsque vous ont été construits); au lieu de cela, vous appelez la méthode qui est spécifié par le délégué, que vous recevrez au moment de l'exécution.
Voir, par exemple, tous les lieux où des délégués et/ou des événements sont utilisés dans le >NET framework: par exemple, le de Contrôle.Cliquez sur l'Événement ou le List<T>.ForEach Méthode.
Voici un exemple de la
atexit
fonction (et la référence àon_exit
)qui s'exécute lorsque le processus s'arrête. La fonctionbye
(dans l'exemple) est appelée par le système d'exploitation lorsqu'il détecte le processus de sortie. gnu.org/s/libc/manual/html_node/Cleanups-on-Exit.htmlOriginalL'auteur ChrisW
Techniquement, vous n'avez pas à utiliser des délégués (sauf lors de l'utilisation de les gestionnaires d'événements, il est alors nécessaire). Vous pouvez vous en tirer sans eux. Vraiment, ils sont juste un autre outil dans la boîte à outils.
La première chose qui vient à l'esprit à propos de l'utilisation, est L'Inversion De Contrôle. Chaque fois que vous voulez contrôler la façon dont une fonction se comporte de l'extérieur, la meilleure façon de le faire est de placer un délégué en tant que paramètre, et exécuter le délégué.
OriginalL'auteur kemiller2002
Vous n'êtes pas à penser comme un programmeur.
La question est, Pourquoi vous appelez une fonction directement lorsque vous pourriez appeler un délégué?
Je suis un peu pince-sans-rire. Évidemment, vous allez appeler directement les fonctions de la plupart du temps, surtout au sein d'un module. Mais les délégués sont utiles lorsqu'une fonction doit être invoquée dans un contexte où l'objet n'est pas disponible (ou du), tels que les rappels d'événement.
OriginalL'auteur harpo
Il y a deux endroits que vous pouvez utiliser délégués dans le pattern observer. Depuis que je ne suis pas sûr que l'on vous parle, je vais essayer de répondre à deux.
La première consiste à utiliser des délégués dans le sujet au lieu d'une liste de IObservers. Cette approche semble beaucoup plus propre à la gestion de la multidiffusion depuis en gros, vous avez
au lieu de
Sauf si vous avez besoin de faire quelque chose de spécial et qui nécessitent une référence à l'ensemble de la IObserver objet, je pense que les délégués serait plus propre.
Le deuxième cas consiste à utiliser le pass délégués au lieu de IObervers par exemple
Avec cela, les Observateurs n'ont pas besoin d'implémenter une interface. Vous pouvez même passer dans une expression lambda. Cette des changements dans le niveau de contrôle est à peu près la différence. Si c'est bon ou mauvais est à vous.
OriginalL'auteur Jacob Adams
Un délégué est, en effet, en passant autour d'une référence à une méthode, pas un objet... Une Interface est une référence à un sous-ensemble des méthodes mises en œuvre par un objet...
Si, dans certains composants de votre application, vous devez avoir accès à plus d'une méthode d'un objet, puis de définir une interface représentant le sous-ensemble des objets de méthodes, et d'attribuer et de mettre en œuvre cette interface sur toutes les classes que vous pourriez avoir besoin pour passer à ce composant... Puis passer les instances de ces classes par cette interface au lieu de leur classe de béton..
Si, otoh, que, dans une méthode, ou un composant, tous vous avez besoin est l'un de plusieurs méthodes, qui peuvent être dans un certain nombre de catégories différentes, mais tous ont la même signature, alors vous devez utiliser un délégué.
OriginalL'auteur Charles Bretana
Je suis à la répétition d'une réponse que j'ai donné à cette question.
J'ai toujours comme la Station de Radio métaphore.
Lorsqu'une station de radio souhaite diffuser de quelque chose, c'est juste qu'il dirige. Il n'a pas besoin de savoir si il est en fait il ya quelqu'un à l'écoute. Votre radio est en mesure de s'enregistrer avec la station de radio (par le réglage avec la molette), et toutes les émissions de radio (les événements dans notre petite métaphore) sont reçus par la radio qui se traduit en sons.
Sans cette inscription (ou un événement). La station de radio ont à communiquer avec chaque radio à son tour et lui demander s'il voulait l'émission, si votre radio a dit oui, puis envoyer le signal directement.
Votre code peut très proche de paradigme, où une classe effectue une action, mais cette classe ne peut pas savoir, ou ne pas vouloir savoir qui ne se soucient, ou d'agir sur cette action. Il fournit un moyen pour n'importe quel objet à enregistrer ou annuler l'enregistrement lui-même pour la notification que l'action a eu lieu.
Je suppose que je suis prise d'un saut ou deux, mais un délégué est juste une référence à une méthode. L'OP a demandé pourquoi vous auriez besoin d'une référence à une méthode. Je lui ai répondu avec une métaphore d'une utilisation classique de délégués (ie. les événements).
OriginalL'auteur Matthew Vines
Délégués sont typage fort pour la fonction/méthode interfaces.
Si votre langue prend la position qu'il devrait être taper fort, et qu'il dispose des fonctions de classe (C#), alors il serait incohérent de pas ont des délégués.
Envisager une méthode qui prend un délégué. Si vous ne disposez pas d'un délégué, comment pourriez-vous donner quelque chose à cela? Et comment le le destinataire de l'appel ont aucune garantie quant à son type?
OriginalL'auteur Ken
J'ai entendu dire que certains événements "évangélistes" parler de cela et ils disent que comme de plus en plus découplées événements sont, mieux c'est.
De préférence, la source de l'événement ne doit jamais savoir sur les écouteurs d'événement et l'écouteur d'événement ne devrait jamais se soucient qui est à l'origine de l'événement. Ce n'est pas la façon dont les choses sont aujourd'hui parce que dans l'écouteur d'événement vous recevez normalement l'objet source de l'événement.
Avec cela dit, les délégués sont l'outil parfait pour ce travail. Ils permettent le découplage entre la source de l'événement et l'événement observateur parce que la source de l'événement n'a pas besoin de garder une liste de tous les observateurs objets. Il ne conserve qu'une liste de pointeurs de fonction" (délégués) des observateurs.
De ce fait, je pense que c'est un grand avantage sur les Interfaces.
OriginalL'auteur bruno conde
Regarder de l'autre façon. Quel intérêt à l'aide d'une interface personnalisée ont sur l'aide de la méthode standard qui est pris en charge par la langue à la fois la syntaxe et de la bibliothèque?
Certes, il y sont les cas où il une solution sur mesure peut avoir des avantages, et dans de tels cas, vous devez l'utiliser. Dans tous les autres cas, l'utilisation la plus canonique solution disponible. C'est moins de travail, plus intuitive (parce que c'est ce qu'attendent les utilisateurs), a plus de support d'outils (y compris l'IDE) et les chances sont, le compilateur traite différemment, résultant en un code plus efficace.
Ne pas réinventer la roue (à moins que la version actuelle est cassé).
votre point 1 que partiellement vrai: vous pouvez implémenter votre propre délégué des classes comme pour une utilisation avec des références faibles – ce qui est particulièrement important avec les événements et pris en charge par le
custom event
sytax. Je ne suis pas sûr au sujet de votre deuxième point, ce n'est pas quelque chose que l'observateur peut décider de toute façon, une fois qu'il est appelé? Je ne vois pas le problème.Il n'y a pas de bonne façon de mettre en œuvre les faibles comportement de l'événement sans une coopération spéciale par le code de l'utiliser. Alors qu'un gestionnaire d'événement qui reçoit un événement, il n'est pas intéressé pourrait tenter de se désabonner, en essayant de vous désabonner à partir de l'intérieur d'un gestionnaire d'événements peut potentiellement provoquer un blocage, selon la façon dont l'événement est mis en œuvre. Je ne crois pas qu'il sans danger pour un gestionnaire de supposer qu'il est possible de se désabonner à l'intérieur d'un événement en cours d'exécution.
OriginalL'auteur Konrad Rudolph
En fait il y avait un va-et-vient entre Sun et Microsoft sur les délégués. Alors que le Soleil fait une assez forte position contre les délégués, j'ai l'impression que Microsoft a fait une encore plus fort point pour l'utilisation de délégués. Voici les messages:
http://java.sun.com/docs/white/delegates.html
http://msdn.microsoft.com/en-us/vjsharp/bb188664.aspx
Je pense que vous trouverez ces lecture intéressante...
OriginalL'auteur code4life
je pense que c'est plus lié à la syntatic sucre et un moyen d'organiser votre code, un bon exemple serait la poignée de plusieurs méthodes liées à un contexte commun de ceux qui appartiennent à un objet ou à une classe statique.
ce n'est pas que vous êtes obligés de les utiliser, vous pouvez programme sth avec et sans eux, mais peut-être de les utiliser ou pas peut affecter la façon dont a organisé, lisible et pourquoi pas cool le code serait, peut-être bum quelques lignes dans votre code.
Chaque exemple donné ici est un bon endroit où vous pourriez mettre en œuvre, comme quelqu'un l'a dit, est juste une autre caractéristique de la langue, vous pouvez jouer avec.
salutations
OriginalL'auteur jgemedina
Ici est quelque chose que je peux écrire comme une raison de l'utilisation de délégué.
Le code suivant est écrit en C# Et suivez les commentaires.
Meilleures Salutations,
Pritom Nandy,
Bangladesh
OriginalL'auteur Pritom Nandy
Voici un exemple qui pourrait vous aider.
Il y a une application qui utilise un grand ensemble de données. Une fonctionnalité est nécessaire qui permet aux données d'être filtré. 6 filtres différents peuvent être spécifiés.
Immédiate de la pensée est de créer 6 méthodes différentes que chaque renvoyer les données filtrées. Par exemple
Données publiques FilterByAge(int age)
Données publiques FilterBySize(int taille)
.... et ainsi de suite.
C'est bien, mais est très limitée et produit des déchets code car il est fermé pour l'expansion.
Une meilleure façon est d'avoir une seule méthode de filtrage et de transmettre des informations sur la manière dont les données doivent être filtrées. C'est là un délégué peut être utilisé. Le délégué est une fonction qui peut être appliquée à ces données afin de les filtrer.
Données publiques Filtre(filtre d'actions)
ensuite le code pour utiliser cela devient
Filtre(données => les données.âge > 30);
Filtre(données => les données.size = 19);
Le code de données => bla bla devient un délégué. Le code devient beaucoup plus souple et reste ouverte.
OriginalL'auteur Zain Ali