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? P>
8 Réponses :
Les délégués sont souvent utilisés pour Une autre explication bien mis de MSDN, p>
Un bon exemple d'utilisation
l'interface unique au lieu d'un procédé
délégué est Depuis .NET 2.0, il a également été utilisé pour
0 commentaires
Événements code>. Selon MSDN, les délégués dans .NET sont conçus pour les éléments suivants: p>
IComparable code> ou
IComparable code>.
IComparable code> 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. p>
blockQuote>
Eh bien, quelques utilisations communes: p>
Ne pense pas à eux comme des appels de méthode d'encapsulation. Pensez à eux comme encapsulant un peu de comportement / logique arbitraire avec une signature particulière. La partie "méthode" est un peu non négligeante. P>
Une autre façon de penser d'un type de délégué est une interface à méthode unique. Un bon exemple de ceci est le Icomarer
interface et son double, le comparaison
type de délégué. Ils représentent la même idée de base; Parfois, il est plus facile d'exprimer cela en tant que délégué et d'autres fois qu'une interface facilite la vie. (Vous pouvez facilement écrire du code pour convertir entre les deux, bien sûr.) P>
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. p>
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. P>
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 em> 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! P>
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. P>
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. P>
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: -) p>
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. P>
Le livre "illustré C #" de Dan Solis fournit le point d'entrée le plus facile pour apprendre ce concept que j'ai rencontré: p>
http://www.amazon.com/illustrated -2008-Windows-Net-Daniel-Solis / DP / 1590599543 P>
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 :-)
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. P>
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. P>
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. . P>
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. P>
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. P>
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; }
Chaque fois que je lis le titre de cette question, je l'entends dans la voix de Jerry Seinfeld.