web-dev-qa-db-fra.com

Quels sont les avantages des délégués?

Quels sont les avantages/avantages de l'utilisation de délégués? Quelqu'un peut-il fournir des exemples simples?

24
Xaisoft

Ils sont un excellent moyen d'encapsuler un morceau de code. Par exemple, lorsque vous attachez un gestionnaire d'événements sur le bouton, ce gestionnaire est un délégué. Le bouton n'a pas besoin de savoir ce que cela fait, juste comment l'appeler au bon moment.

Un autre exemple est le filtrage LINQ - la projection, etc., nécessite tout le même type de code de modèle; Tout ce qui change est la logique de représenter le filtre, la projection, etc. avec des expressions Lambda au C # 3 (qui sont converties en délégués ou arbres d'expression) cela le rend vraiment simple:

var namesOfAdults = people.Where(person => person.Age >= 18)
                          .Select(person => person.Name);

(Cela peut également être représenté comme une expression de requête, mais ne sortons pas trop loin des délégués.)

Une autre façon de penser à un délégué est en tant que type d'interface à la méthode. Par exemple, le type de délégué EventHandler est un peu comme:

public interface IEventHandler
{
    void Invoke(object sender, EventArgs e)
}

Mais le soutien des délégués dans le cadre permet aux délégués d'être enchaînés ensemble, invoqués de manière asynchrone, utilisés comme gestionnaires d'événements, etc.

Pour plus d'informations sur les délégués et les événements, voir mon article sur le sujet . Son objectif est des événements, mais cela couvre également les délégués.

44
Jon Skeet

C'est un sujet assez vague, mais voici quelques points à considérer -

Les délégués sont fondamentalement un pointeur de fonction plus simple et plus facile. Tout endroit où les pointeurs de fonction ont été utilisés dans C++, vous pouvez penser délégué.

Avantages à les utiliser dans la conception :

  • Peut conduire à une réutilisation facile du code
  • Peut fournir une grande quantité de flexibilité dans vos conceptions
  • Vous permettent de développer des bibliothèques et des classes facilement extensibles, car il fournit un moyen simple de crochet dans d'autres fonctionnalités (par exemple, une clause où la clause de Linq peut utiliser un délégué [Func<T,bool>] Pour filtrer, sans avoir à écrire de nouveau code dans la méthode de l'endroit où

Inconvénients potentiels :

  • Ils ~can~, en particulier s'il est utilisé naïvement, conduire à un code plus difficile à lire
  • Ils peuvent introduire un comportement dans votre composant inattendu, car le code 3ème partie de votre contrôle sera appelé (par exemple, si quelqu'un attache un délégué à l'un de vos événements qui provoque une boucle infinie, elle peut rendre votre classe malade, Même si cela n'a rien à voir avec vous)
12
Reed Copsey

Les délégués servent trois objectifs:

  1. Une implémentation simplifiée du modèle d'observateur
  2. Une implémentation simplifiée de rappels
  3. Blocs de code anonymes (non réutilisables)

Observateur

public class Something
{
    public event EventHandler SomethingHappened;
}

public class SomethingConsumer
{
    private mySomething = new Something();

    public void WireUpEvents()
    {
        mySomething.SomethingHappened += whenSomethingHappened;
    }

    private void whenSoemthingHappened(object sender, EventArgs e)
    {
        // do something
    }
}

CallBack

public void DoSomethingAsynchronously(EventHandler callBack)
{
    // long running logic.
    callBack(this, EventArgs.Empty);
}

Code anonyme non réutilisable

public void DoSomethingReusably(Action nonReusableCode)
{
    // reusable code
    nonReusableCode();
    // more reusable code
}

public void DoALotOfSomething()
{
    DoSomethingReusably(() => { /* non-reusable code here */ });
    DoSomethingReusably(() => { /* non-reusable code here */ });
    DoSomethingReusably(() => { /* non-reusable code here */ });
}

Dans tous les cas, il suffit de fournir une conciliation.

6
Michael Meadows

Le délégué en C # est EQV. Pour fonctionner le pointeur en C, mais il transmet également une référence à l'instance de classe qu'il a été créée.

Tous les gestionnaires d'événements sous Windows sont des délégués.

2
Joshua

Avantages par rapport à quoi? Les délégués peuvent être des choses utiles et ont sûrement leur place dans beaucoup de code C # modérément complexe. (Chaque fois que vous utilisez des événements dans des classes, vous utilisez implicitement des délégués de multidiffusion). Si vous souhaitez une introduction à sa syntaxe et à leur utilisation, je recommande les articles suivants:

2
Noldorin

Disclaimer: Je ne dis pas comment j'ai utilisé un délégué est à la manière prévue, mais c'est un exemple.

Je ne l'ai utilisé qu'une fois avant, mais dans notre application, l'utilisateur clique sur un bouton "Terminer" pour une étape qui les prend ensuite sur une page de routage pour décider où l'envoyer ensuite. Donc, techniquement, le pas, ils ont simplement cliqué sur "Terminer" sur ce n'est vraiment fini jusqu'à ce qu'ils l'acheminent. Mais depuis que je suis sur une autre page, je n'ai pas facilement accès à l'endroit où ils étaient juste.

Donc, ce que j'ai fait a été créé un délégué pour les quelques étapes nécessitant un traitement spécial (dans ce cas un courrier électronique) lorsque le clic "complet", et quand ils l'ont acheminée à la page suivante, je vérifierais l'existence du délégué et si C'était là appeler cela pour déclencher mon événement "stocké".

Créatif: probablement, faux: peut-être, travaillant: définitivement.

Comme je l'ai dit probablement pas comment il était destiné à être utilisé, mais le codage est autant d'art que la science non?

2
Jeff Keslinke

Je me souviens d'un Java Cadre GUI qui n'avait aucun concept de délégués ou de routage de commandement. Afin de faire un bouton qui fait quelque chose, vous avez dû bouton de sous-classe et remplacer la méthode de clic. Vous avez terminé avec beaucoup de sous-classes d'éléments UI avec de petits bits de votre code d'application.

Le code qui gère ce qui clique doit aller quelque part et dans un langage OO comme Java ou C # Il doit aller sur une classe, mais les délégués lui permettent de se produire sur un endroit pratique. Cela conduit souvent à avoir trop de code faire trop de choses différentes dans une classe de formulaire, mais c'est un problème différent.

1
Anthony