7
votes

Quel est l'accord avec les délégués?

Je comprends les délégués encapsuler des appels de méthode. Cependant, j'ai du mal à comprendre leur besoin. Pourquoi utiliser des délégués du tout, quelles sont-elles conçues?


1 commentaires

Chaque fois que je lis le titre de cette question, je l'entends dans la voix de Jerry Seinfeld.


8 Réponses :


4
votes

Les délégués sont souvent utilisés pour Événements . Selon MSDN, les délégués dans .NET sont conçus pour les éléments suivants:

  • Un design pattern concours complet est utilisé.
  • Il est souhaitable d'encapsuler une méthode statique.
  • L'appelant n'a pas accès besoin d'autres propriétés, méthodes ou interfaces l'objet d'implémentation de la méthode.
  • composition facile est souhaitée.
  • Une classe peut avoir besoin de plus d'une mise en œuvre du methodimplementation de la méthode

    Une autre explication bien mis de MSDN,

    Un bon exemple d'utilisation l'interface unique au lieu d'un procédé délégué est IComparable ou IComparable . IComparable déclare la Procédé CompareTo, qui renvoie un entier spécifiant une inférieure, égale à, ou supérieur à la relation entre deux objets du même type. IComparable peut être utilisé comme base d'un algorithme de tri, et en utilisant un déléguer méthode de comparaison en tant que base d'un algorithme de tri serait valide, il est idéal. Parce que le capacité à comparer appartient à la classe, et l'algorithme de comparaison ne change pas au moment de l'exécution, un Interface simple méthode est l'interface-ideal.single procédé est idéal.

    Depuis .NET 2.0, il a également été utilisé pour 0 commentaires



0
votes

Les délégués vous permettent de transmettre une référence à une méthode. Un exemple courant est de passer une méthode de comparaison à une fonction de tri.


0 commentaires

5
votes

Ils sont conçus, très largement parlant, car lorsque vous avez du code que vous savez devra appeler autre code - mais vous ne savez pas au moment de la compilation de ce que cet autre code pourrait être.

Par exemple, pensez à l'événement Windows Forms Button.click, qui utilise un délégué. Les programmeurs Windows Formulateurs savent que vous voudrez quelque chose se produire lorsque ce bouton est enfoncé, mais ils n'ont aucun moyen de savoir exactement ce que vous voudrez faire ... Cela pourrait être n'importe quoi!

Vous créez donc une méthode et attribuez-la à un délégué et définissez-la à cet événement, et vous y êtes. C'est le raisonnement de base des délégués, bien qu'il y ait beaucoup d'autres bonnes utilisations qui sont liées.


0 commentaires

11
votes

Un délégué est fondamentalement un pointeur de méthode. Un délégué permet de créer une variable de référence, mais au lieu de faire référence à une instance d'une classe, elle fait référence à une méthode à l'intérieur de la classe. Il fait référence à toute méthode qui a un type de retour et a les mêmes paramètres que ceux spécifiés par ce délégué. C'est un aspect très très utile de l'événement. Pour une lecture approfondie, je vous suggérerais de lire le sujet dans Head d'abord C # (par Andrew Stellman et Jennifer Greene). Il explique magnifiquement le sujet des délégués ainsi que la plupart des concepts de .NET.


0 commentaires

0
votes

Si vous devez décider au moment de l'exécution, quelle méthode à appeler, alors vous utilisez un délégué. Le délégué répondra ensuite à une action / événement à l'exécution et appelez la méthode appropriée. C'est comme envoyer un "délégué" à un mariage que vous ne voulez pas assister à vous-même: -)

Le cm Les gens reconnaîtront cela comme un pointeur de la fonction, mais ne vous êtes pas rattrapé dans la terminologie ici. Tout le délégué fait (et c'est en fait un type), fournit la signature de la méthode qui sera appelée ultérieurement pour mettre en œuvre la logique appropriée.

Le livre "illustré C #" de Dan Solis fournit le point d'entrée le plus facile pour apprendre ce concept que j'ai rencontré:

http://www.amazon.com/illustrated -2008-Windows-Net-Daniel-Solis / DP / 1590599543


4 commentaires

Pendant que j'arrive très bien d'APRESS ... Quelle est l'utilisation de la liaison d'un livre "non encore publié"?


@Wernercd, merci pour la tête. Il y a deux éditions précédentes, donc je suis à jour de la mise à jour :-)


J'adore absolument C # illustré 2008 et j'attendais l'attente de 2010 pour être libéré ... c'était la première chose que j'ai remarquée heh :)


C'était la version 2005 de ce livre qui m'a finalement aidé à me donner la tête des délégués :-)



0
votes

Un délégué est généralement une combinaison d'une référence d'objet et d'un pointeur à l'une des méthodes de classe de l'objet (les délégués peuvent être créés pour des méthodes statiques, auquel cas il n'y a pas de référence d'objet). Les délégués peuvent être invoqués sans tenir compte du type de l'objet fourni, car le pointeur de la méthode fourni est garanti pour être valide pour l'objet fourni.

Comprendre une partie de l'utilité derrière les délégués, repensez à la langue C et la "famille" printf des fonctions de C. Supposons que l'on souhaitait avoir une version générale de "Printf" qui pourrait non seulement être utilisée En tant que printf, fprintf, sprintf, etc. mais pourrait envoyer sa sortie à un port série, une zone de texte, un port TCP, une machine à givre de cookie, ou tout ce qui est sans avoir à prélever un tampon. Il serait clair que d'une telle fonction nécessiterait d'accepter un pointeur de fonction pour la routine de caractère-sortie, mais cela serait généralement insuffisant.

Une implémentation typique (malheureusement non normalisée) aura une routine GP_PRINTF générale qui accepte (en plus des paramètres de chaîne de format et de sortie) un pointeur vide et un pointeur sur une fonction qui accepte un caractère et un pointeur vide . La routine GP_PRINTF n'utilisera pas le pointeur vide transmis à un but lui-même, mais le transmettre à la fonction de sortie de caractères. Cette fonction peut ensuite lancer le pointeur sur un fichier * (si GP_PRINTF est appelé par FPRRINTF), ou un char * ** (s'il est appelé par Sprintf), ou un SERIAL_PORT * (s'il est appelé par SERIAL_PRINTF), ou quoi que ce soit. .

Notez que parce que tout type d'informations pourrait être transmis via le vide *, il n'y aurait aucune limite sur ce que GP_PRINTF pourrait faire. Il y aurait un danger, cependant: si les informations passées dans le vide * ne sont pas ce que la fonction attend, un comportement indéfini (c'est-à-dire de très mauvaises choses) résulterait probablement. Il serait de la responsabilité de l'appelant de s'assurer que le pointeur de la fonction et le vide * sont correctement associés; rien dans le système ne protège contre une utilisation incorrecte.

in .NET, un délégué fournirait la fonctionnalité combinée du pointeur de fonction et du vide * ci-dessus, avec le bonus supplémentaire que le constructeur du délégué garantirait que les données étaient du type approprié pour la fonction. Une fonctionnalité pratique.


0 commentaires

1
votes

Sans simplification: Je dirais qu'un délégué est un espace réservé pour une fonction jusqu'à ce moment où quelque chose attribue une fonction réelle au délégué. Appeler des délégués assignés jette une exception.

Confusion se produit car il y a souvent peu de différence entre la définition, la déclaration, l'instanciation et l'invocation des délégués. P>

strong> Définition: strong> de
Mettez ceci dans un espace de noms comme vous feriez une définition de classe. P>

public delegate bool DoSomething(string withWhat);

class MyClass {
    private event DoSomething MyEvent;
}


0 commentaires