12
votes

Meilleures pratiques: quand devrais-je utiliser un délégué à .net?

Duplicates possibles:

Utilisation des délégués: Applications d'affaires

Où dois-je utiliser des délégués?

salut,

Je suis nouveau au concept d'un délégué à .net - Je ne les ai pas encore utilisés et pensez qu'ils sont probablement là pour une bonne raison - quand devrais-je utiliser un délégué?

Les exemples sont les bienvenus.


4 commentaires

Il y a beaucoup de questions similaires, comme celle-ci: Stackoverflow.com / QUESTIONS / 31497 / OUTILISÉE-DO-I-UTILISE-UTILISER-DÉLÉDÉS


Ou celui-ci: Stackoverflow.com/questions/628803/...


Ou celui-ci: Stackoverflow.com/questions/635015/...


En outre, outre tout ce qui a été dit par d'autres personnes, Lambda Expressions dans les nouvelles versions de .NET est directement basée sur les délégués.


7 Réponses :


2
votes

Événements Utilisez des délégués dans les coulisses .

Si vous utilisez des événements, vous avez utilisé des délégués, mais simplement avec une syntaxe plus agréable.

Fondamentalement, une utilisation pour eux est pour les rappels ou la programmation basée sur des événements.


0 commentaires

2
votes

Les délégués sont utilisés pour la programmation axée sur les événements. Les meilleures pratiques sont souvent liées au découplage du code (ou du couplage «lâche»). En utilisant des délégués, vous pouvez vous abonner des méthodes aux événements, au lieu d'avoir X appeler y si quelque chose se passe, puis j'appelle Z sous une certaine condition et ainsi de suite.


0 commentaires

4
votes

Les délégués sont utiles lorsque vous devez indiquer un autre morceau de code comment faire quelque chose. Les événements sont l'exemple le plus simple - séparant l'événement (quelque chose est arrivé) de comment pour le gérer. D'autres exemples sont des opérations itératives communes, telles qu'un trouvaille personnalisé: xxx

ce qui précède est un exemple totalement arbitraire, mais indique que vous pouvez séparer le quoi (itération et exécution d'une "recherche" critères) de comment (Comment déterminer si quelque chose est trouvé).


0 commentaires

8
votes

Les délégués fournissent un moyen de passer comportement comme paramètre.

Des exemples courants sont des événements et des programmes asynchrones où autre chose que votre objet est responsable de l'appel à votre objet. Vous fournissez cet événement avec un délégué et maintenant, il est capable d'exécuter le comportement associé à ce délégué.

Ceci peut également être une technique utile lors de la mise en œuvre d'un algorithme général. Il y a eu des moments où j'écris plusieurs méthodes très similaires. Peut-être qu'ils bouclent-ils sur le même ensemble de données, mais ils effectuent des tâches légèrement différentes. Je peux transmettre un délégué à une seule fonction pour effectuer cette tâche, puis appeler le délégué de l'intérieur de la boucle sur les données. De cette façon, je n'ai pas à mettre en œuvre la boucle sur les données plusieurs fois, je n'ai qu'à écrire un nouveau code qui fait de nouvelles choses - le comportement commun est capturé de manière courante.

En réponse au commentaire:

La différence entre appeler le délégué de la boucle et appeler la méthode de la boucle est que le délégué est un paramètre à la fonction contenant la boucle. Cela signifie que cette fonction pourrait faire n'importe quoi, pas seulement ce qui est défini dans une méthode particulière. Cette flexibilité peut et a été exploitée pour fournir des algorithmes génériques dans des bibliothèques totalement indépendantes des spécificités de ce que fonctionnent les algorithmes. LINQ est un bon exemple de la généralité autorisée via la flexibilité des délégués.


1 commentaires

Votre réponse est un peu vague pour moi. Quelle est la différence entre appeler un délégué de la boucle et appeler une méthode simple de cette boucle?



2
votes

événements et rappels dans le Les directives .NET leur explique bien.

En résumé, vous devez préférer les événements dans des API simples, car il existe un fort soutien de l'IDE et la plupart des développeurs sont à l'aise avec des événements. Toutefois, si vous avez besoin de l'utilisateur pour fournir du code qui sera exécuté, vous devez envisager d'utiliser des délégués ou des membres virtuels. Les rappels sont moins performants, mais si vous utilisez des délégués tels que action et Func vous permettez à Lambdas.


0 commentaires

3
votes

En outre, je recommanderais d'utiliser des types de délégués génériques au lieu de créer votre propre. Exemples ci-dessous:

EventHandler
FUNC
FUNC
FUNC ETC ...
Action
Action

Action, etc ...


1 commentaires

Aaron- c'est un bon point. Les directives de conception-cadre indiquent maintenant que vous devriez éviter de créer des délégués personnalisés - blogs.msdn.com/brada/archive/2009/01/26/...



1
votes

Exemple de cas: une seule ressource est utilisée par plusieurs objets. La ressource a besoin d'un rappel asynchrone à ces objets, mais la nature de la ressource exige qu'une seule demande soit active à un moment donné, et cette demande est liée à un objet particulier. En raison de l'architecture, je ne veux pas transmettre les objets dans la ressource, à la place, j'envoie la ressource un délégué de chaque objet et stocker ces délégués avec des identifiants d'objet. Lorsqu'une demande est faite, je peux rechercher l'identifiant d'objet correspondant et appeler son délégué spécifique.

Je l'ai initialement mis en œuvre avec un événement, mais depuis que l'événement ne pouvait pas être "destiné" à un objet particulier, j'avais des problèmes. Je ne suis pas sûr que c'est la meilleure pratique, mais cela semble bien fonctionner pour moi.


0 commentaires