57 votes

Pourquoi essayer de comprendre les délégués a-t-il envie d'essayer de comprendre la nature de l'univers?

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.

18voto

Byron Whitlock Points 29863

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.

4voto

Martin Points 4844

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.

4voto

tanascius Points 22712

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.

4voto

Jay Riggs Points 30783

Cet article de Chris Sells pourrait aider:

Délégués .NET: AC # Bedtime Story

3voto

herzmeister Points 7077

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. ;-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X