Quels sont les avantages de délégués? [dupliquer]

cette question a déjà une réponse ici:

Quels sont les avantages de faire appel à des délégués? Quelqu'un peut-il fournir toute simple, des exemples?

23
demandé sur Joel Coehoorn 2009-03-12 19:04:58

7 réponses

c'est une bonne façon d'encapsuler un morceau de code. Par exemple, lorsque vous attachez un gestionnaire d'événement pour le bouton, ce gestionnaire est un délégué. Le bouton n'a pas besoin de savoir ce qu'il fait, juste la façon d'appeler au bon moment.

un autre exemple est LINQ - filtrage, projection etc tous nécessitent le même type de code de modèle; tout ce qui change est la logique pour représenter le filtre, la projection, etc. Avec les expressions lambda en C# 3 (qui sont converties en délégués ou arbres d'expression) cela rend les choses vraiment simples:

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

(qui peut aussi être représenté comme une expression de requête, mais ne nous éloignons pas trop des délégués.)

une autre façon de penser d'un délégué est comme un type d'interface de méthode unique. Par exemple, le type de délégué EventHandler est un peu comme:

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

mais l'appui du délégué dans le cadre permet aux délégués d'être enchaînés ensemble, invoqué asynchrone, utilisé comme gestionnaire d'événements, etc.

pour en savoir plus sur les délégués et les événements, voir mon article sur le thème . Il se concentre sur les événements, mais il couvre aussi les délégués.

43
répondu Jon Skeet 2009-03-12 16:07:20

c'est un sujet assez vague, mais voici quelques choses à considérer -

les délégués sont essentiellement un pointeur de fonction plus propre et plus facile. N'importe quel endroit où des pointeurs de fonction ont été utilisés en C++, vous pouvez penser à delegate.

avantages de leur utilisation dans la conception:

  • peut conduire à une réutilisation facile du code
  • peut fournir une grande flexibilité dans vos conceptions
  • vous permet de développer des bibliothèques et des classes qui sont facilement extensibles, car il fournit un moyen facile d'accrocher dans d'autres fonctionnalités (par exemple, une clause where dans LINQ peut utiliser un délégué [Func<T,bool>] pour filtrer sur, sans avoir à écrire de nouveau code dans la méthode Where

inconvénients potentiels:

  • ils ~can~ , en particulier s'ils sont utilisés naïvement, conduisent à coder que est plus difficile à lire
  • ils peuvent introduire dans votre component un comportement inattendu, car un code tiers hors de votre contrôle sera appelé (par exemple, si quelqu'un attache un délégué à un de vos événements qui provoque une boucle infinie, il peut faire paraître votre classe mauvaise, même si elle n'a rien à voir avec vous)
12
répondu Reed Copsey 2014-05-05 10:33:00

les délégués remplissent trois fonctions:

  1. Une mise en oeuvre simplifiée du modèle Observateur
  2. Une mise en oeuvre simplifiée des 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, c'est juste une question de fournir conciceness.

5
répondu Michael Meadows 2009-03-12 16:14:10

Délégué en C# est eqv. de pointeur de fonction en C, mais il comporte également une référence à l'instance de la classe qu'il a été créé à partir.

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

2
répondu Joshua 2009-03-12 16:10:09

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 les classes, vous utilisez implicitement les délégués multicast). Si vous voulez une introduction à leur syntaxe et leurs utilisations, je recommande les articles suivants:

2
répondu Noldorin 2009-03-12 16:10:13

Avertissement: 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 fondamentalement dans notre application l'utilisateur clique sur un bouton "complet" pour une étape qui les amène ensuite à une page de routage pour décider où l'envoyer ensuite. Donc techniquement, l'étape sur laquelle ils ont cliqué N'est pas vraiment terminée tant qu'ils ne l'ont pas tournée. Mais comme je suis sur une autre page, je n'ai pas eu facilement accès à l'endroit où ils étaient.

donc, ce que j'ai fait a été créé un délégué pour les quelques étapes qui ont nécessité un traitement spécial (dans ce cas un email) lorsque le cliqué "complète", et quand ils routés sur la page suivante, je vérifierais l'existence du délégué et s'il était là l'appeler pour lancer mon événement "stocké".

Créatif: probablement, mal: peut-être, de travail: certainement.

comme j'ai dit probablement pas comment il a été conçu pour être utilisé, mais le codage est comme beaucoup d'art comme la science du droit?

2
répondu Jeff Keslinke 2009-03-12 16:26:21

je me souviens d'un premier Java GUI framework qui n'avait aucun concept de délégués ou de routage de commande. Afin de faire un bouton qui fait quelque chose, vous avez dû bouton de la sous-classe et remplacer la méthode de clic. Vous avez fini avec des tas et des tas de sous-classes D'éléments D'UI avec des petits morceaux de votre code d'application dedans.

le code qui gère ce clic doit aller quelque part, et dans un langage OO comme Java ou C# il doit aller sur un cours, mais les délégués permettent que cela se fasse à un endroit approprié. Cela conduit souvent à avoir trop de code faire trop de choses différentes dans une classe de forme, mais c'est une question différente.

1
répondu Anthony 2009-03-12 16:56:01