Réponses:
Un délégué est un type nommé qui définit un type particulier de méthode. Tout comme une définition de classe présente tous les membres pour le type d'objet donné qu'elle définit, le délégué présente la signature de méthode pour le type de méthode qu'il définit.
Sur la base de cette instruction, un délégué est un pointeur de fonction et il définit à quoi ressemble cette fonction.
Un excellent exemple pour une application réelle d'un délégué est le prédicat . Dans l'exemple du lien, vous remarquerez que Array.Find prend le tableau pour rechercher, puis un prédicat pour gérer les critères de recherche. Dans ce cas, il passe une méthode ProductGT10 qui correspond à la signature Predicate.
Comme indiqué dans "Apprentissage de C # 3.0: maîtrisez les principes fondamentaux de C # 3.0"
Scénario général: Lorsqu'un chef d'État décède, le président des États-Unis n'a généralement pas le temps d'assister personnellement aux funérailles. Au lieu de cela, il envoie un délégué. Souvent, ce délégué est le vice-président, mais parfois le vice-président n'est pas disponible et le président doit envoyer quelqu'un d'autre, comme le secrétaire d'État ou même la première dame. Il ne veut pas «câbler» son autorité déléguée à une seule personne; il pourrait déléguer cette responsabilité à quiconque est en mesure d'exécuter le protocole international approprié.
Le président définit à l'avance quelle responsabilité sera déléguée (assister aux funérailles), quels paramètres seront adoptés (condoléances, paroles aimables) et quelle valeur il espère récupérer (bonne volonté). Il affecte ensuite une personne en particulier à cette responsabilité déléguée au «moment de l'exécution» au fur et à mesure de l'avancement de sa présidence.
En programmation Scénario: Vous êtes souvent confronté à des situations où vous devez exécuter une action particulière, mais vous ne savez pas à l'avance quelle méthode, ni même quel objet, vous voudrez faire appel pour l'exécuter.
Par exemple: un bouton peut ne pas savoir quel ou quels objets doivent être notifiés. Plutôt que de câbler le bouton à un objet particulier, vous connecterez le bouton à un délégué, puis résoudrez ce délégué à une méthode particulière lorsque le programme s'exécutera.
Une utilisation courante des délégués pour les listes génériques consiste à utiliser des délégués d'action (ou son équivalent anonyme) pour créer une opération foreach sur une ligne:
myList.Foreach( i => i.DoSomething());
Je trouve également le délégué Predicate très utile pour rechercher ou élaguer une liste:
myList.FindAll( i => i.Name == "Bob");
myList.RemoveAll( i => i.Name == "Bob");
Je sais que vous avez dit qu'aucun code n'est requis, mais je trouve plus facile d'exprimer son utilité via le code. :)
Si vous souhaitez voir comment le modèle Delegate est utilisé dans le code du monde réel, ne cherchez pas plus loin que Cocoa sur Mac OS X. Cocoa est la boîte à outils d'interface utilisateur préférée d'Apple pour la programmation sous Mac OS X, et est codé en Objective C. C'est conçu pour que chaque composant de l'interface utilisateur soit destiné à être étendu par délégation plutôt que par sous-classement ou par d'autres moyens.
Pour plus d'informations, je vous recommande de consulter ce qu'Apple a à dire sur les délégués ici .
J'avais un projet qui utilisait win32 Python.
Pour diverses raisons, certains modules ont utilisé odbc.py pour accéder à la base de données et d'autres modules - pyodbc.py.
Il y avait un problème lorsqu'une fonction devait être utilisée par les deux types de modules. Il avait un objet de connexion qui lui était passé comme argument, mais il devait ensuite savoir s'il fallait utiliser dbi.dbiDate ou datetime pour représenter les heures.
En effet, odbc.py attendait, en tant que valeurs dans les instructions SQL, que les dates soient dbi.dbiDate tandis que pyodbc.py attendait des valeurs datetime.
Une autre complication était que les objets de connexion créés par odbc.py et pyodbc.py ne permettaient pas de définir des champs supplémentaires.
Ma solution était d'encapsuler les objets de connexion retournés par odbc.odbc (...) et pyodbc.pyodbc (...) par une classe déléguée, qui contient la fonction de représentation temporelle souhaitée comme valeur d'un champ supplémentaire, et qui délègue toutes les autres demandes de champ à l'objet de connexion d'origine.
J'ai eu la même question que vous et je suis allé sur ce site pour une réponse.
Apparemment, je ne l'ai pas mieux compris même si j'ai parcouru les exemples sur ce fil.
J'ai trouvé une grande utilité pour les délégués maintenant que j'ai lu: http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx
Cela peut sembler plus évident pour les nouveaux utilisateurs, car Forms est beaucoup plus compliqué à transmettre des valeurs que les sites Web ASP.NET avec POST / GET (QueryString).
Fondamentalement, vous définissez un délégué qui prend "TextBox text " comme paramètres.
// Formulaire 1
// Class Property Definition
public delegate void delPassData(TextBox text);
// Click Handler
private void btnSend_Click(object sender, System.EventArgs e)
{
Form2 frm= new Form2();
delPassData del=new delPassData(frm.funData);
del(this.textBox1);
frm.Show();
}
// Résumé: définissez le délégué, instanciez la nouvelle classe Form2, affectez la fonction funData () au délégué, passez votre textBox au délégué. Montrez le formulaire.
// Form2
public void passData(TextBox txtForm1)
{
label1.Text = txtForm1.Text;
}
// RÉSUMÉ: prenez simplement TextBox txtForm1 comme paramètres (comme défini dans votre délégué) et affectez le texte d'étiquette au texte de textBox.
J'espère que cela éclairera une certaine utilité sur les délégués :) ..
Une recherche rapide sur Google a abouti à ce http://en.wikipedia.org/wiki/Delegation_pattern . Fondamentalement, chaque fois que vous utilisez un objet qui transfère ses appels à un autre objet, vous déléguez.