J'ai lu deux livres, des tonnes d'exemples. Ils n'ont toujours aucun sens pour moi. Je pourrais probablement écrire du code qui utilise des délégués, mais je ne sais pas pourquoi. Suis-je le seul à avoir ce problème, ou suis-je juste un idiot? Si quelqu'un peut réellement m'expliquer quand, où et pourquoi utiliser un délégué, je t'aimerai pour toujours.
Réponses
Trop de publicités?Les délégués ne sont qu'un moyen de faire circuler une fonction dans une variable.
Vous passez une fonction déléguée pour effectuer un rappel. Par exemple, lorsque vous effectuez des E / S asynchrones, vous transmettez une fonction déléguée (fonction que vous avez écrite avec le paramètre delegate) qui sera appelée une fois les données lues sur le disque.
Comme d'autres personnes l'ont mentionné les délégués sont à portée de main pour les rappels. Elles sont utiles pour l'ensemble de la charge d'autres choses aussi. Par exemple, dans un jeu, j'ai travaillé récemment balles de faire des choses différentes quand ils ont frappé (certains font des dégâts, certains ont effectivement améliorer la santé de la personne à qui ils ont frappé, certains ne le font pas de dégâts, mais le poison de la cible et ainsi de suite). Le classique de la POO façon de le faire serait une base de puce de classe et une charge de sous-classes
Bullet
DamageBullet
HealBullet
PoisonBullet
DoSomethingElseBullet
PoisonAndThenHealBullet
FooAndBarBullet
....
Avec ce modèle, j'ai pour définir une nouvelle sous-classe à chaque fois que je veux un nouveau comportement dans une balle, ce qui est un gâchis et conduit à beaucoup de code dupliqué. Au lieu de cela je l'ai résolu avec les délégués. Une balle a un OnHit délégué, qui est appelée lorsque la balle frappe un objet, et bien sûr, je peux faire que de déléguer tout ce que j'aime. Alors maintenant, je peux créer des balles comme ça
new Bullet(DamageDelegate)
Qui, évidemment, c'est tellement plus agréable façon de faire les choses.
Dans les langages fonctionnels, vous avez tendance à voir beaucoup plus de ce genre de chose.
Peut-être voudrez-vous lire cet article de blog très intéressant sur Higher-Order Functions
implémenté en C #. Ce n’est pas la chose la plus facile, mais plutôt une sorte d’exemples du monde réel avec une utilisation intensive de délégués. Peut-être que cela vous aidera à comprendre quel est leur but.
Un délégué est un simple conteneur qui sait où dans la mémoire de la machine une méthode spécifique est situé.
Tous les délégués ont un Invoke(...)
méthode, donc quand quelqu'un a un délégué, il peut l'exécuter, sans vraiment avoir à connaître ou à peine ce que la méthode de la réalité.
Ceci est particulièrement utile pour le découplage des trucs. GUI cadres ne serait pas possible sans cette notion, parce qu'un Button
simplement ne peut pas savoir quelque chose au sujet de votre programme que vous allez utiliser, de sorte qu'il ne peut pas appeler vos méthodes par elle-même, lorsqu'il est cliqué. Au lieu de cela, vous devez lui indiquer quelles méthodes il doit appeler quand il est cliqué.
Je suppose que vous êtes familier avec les événements et que vous ne les utilisez régulièrement. Un event
champ est en fait une liste de ces délégués (aussi appelé multi-cast délégué). Peut-être que les choses deviendront plus claires lorsque l'on regarde comment on peut "simuler" les événements en C# si elle n'avait pas l' event
mot-clé, mais seulement (non-multicast) délégués:
public class Button : Rectangle
{
private List<Delegate> _delegatesToNotifyForClick = new List<Delegate>();
public void PleaseNotifyMeWhenClicked(Delegate d)
{
this._delegatesToNotifyForClick.Add(d);
}
// ...
protected void GuiEngineToldMeSomeoneClickedMouseButtonInsideOfMyRectangle()
{
foreach (Delegate d in this._delegatesToNotifyForClick)
{
d.Invoke(this, this._someArgument);
}
}
}
// Then use that button in your form
public class MyForm : Form
{
public MyForm()
{
Button myButton = new Button();
myButton.PleaseNotifyMeWhenClicked(new Delegate(this.ShowMessage));
}
private void ShowMessage()
{
MessageBox.Show("I know that the button was clicked! :))))");
}
}
J'espère que je pourrais aider un peu. ;-)