web-dev-qa-db-fra.com

Délégué simple (délégué) vs délégués multidiffusion

J'ai parcouru de nombreux articles, mais je ne comprends toujours pas la différence entre les délégués normaux que nous créons habituellement et les délégués de multidiffusion.

public delegate void MyMethodHandler(object sender);
MyMethodHandler handler = new MyMethodHandler(Method1);
handler += Method2;
handler(someObject);

Le délégué ci-dessus MyMethodHandler appellera ces deux méthodes. Maintenant, où les délégués de multidiffusion entrent-ils en jeu? J'ai lu qu'ils peuvent appeler plusieurs méthodes, mais je crains que ma compréhension de base des délégués ne soit pas correcte.

61
A9S6

Cet article l'explique assez bien:

delegate void Del(string s);

class TestClass
{
    static void Hello(string s)
    {
        System.Console.WriteLine("  Hello, {0}!", s);
    }

    static void Goodbye(string s)
    {
        System.Console.WriteLine("  Goodbye, {0}!", s);
    }

    static void Main()
    {
        Del a, b, c, d;

        // Create the delegate object a that references 
        // the method Hello:
        a = Hello;

        // Create the delegate object b that references 
        // the method Goodbye:
        b = Goodbye;

        // The two delegates, a and b, are composed to form c: 
        c = a + b;

        // Remove a from the composed delegate, leaving d, 
        // which calls only the method Goodbye:
        d = c - a;

        System.Console.WriteLine("Invoking delegate a:");
        a("A");
        System.Console.WriteLine("Invoking delegate b:");
        b("B");
        System.Console.WriteLine("Invoking delegate c:");
        c("C");
        System.Console.WriteLine("Invoking delegate d:");
        d("D");
    }
}
/* Output:
Invoking delegate a:
  Hello, A!
Invoking delegate b:
  Goodbye, B!
Invoking delegate c:
  Hello, C!
  Goodbye, C!
Invoking delegate d:
  Goodbye, D!
*/
73
Darin Dimitrov

La spécification C # stipule que tous les types de délégués doivent être convertibles en System.Delegate. En fait, la façon dont l'implémentation l'implémente est que tous les types de délégués sont dérivés de System.MulticastDelegate, qui dérive à son tour de System.Delegate.

Est-ce clair? Je ne suis pas sûr que cela ait répondu à votre question.

47
Eric Lippert

"Toutes les instances de délégué ont une capacité de multidiffusion." - http://msdn.Microsoft.com/en-us/library/orm-9780596527570-03-04.aspx

"En C #, tous les types de délégués prennent en charge la multidiffusion" - http://msdn.Microsoft.com/en-us/library/orm-9780596516109-03-09.aspx

11
MikeM

Pour clarifier un peu: Tous les délégués sont des instances de la classe MulticastDelegate, qu'ils aient une ou plusieurs méthodes cibles. En principe, il n'y a pas de différence entre un délégué avec une ou plusieurs cibles, bien que le temps d'exécution soit un peu optimisé vers le cas commun avec une seule cible. (Un délégué avec 0 cible n'est pas possible cependant, c'est un ou plusieurs.)

Lorsque vous instanciez un délégué comme new MyMethodHandler(Method1), vous créez un délégué avec une seule cible (la méthode Method1).

Les délégués avec plusieurs cibles sont créés en combinant deux délégués existants. Le délégué résultant aura la somme des objectifs. Les délégués peuvent être combinés explicitement avec Delegate.Combine(), mais aussi implicitement en utilisant l'opérateur += Sur un délégué existant, comme dans votre exemple.

Invoquer un délégué à son tour appelle chaque cible du délégué. Ainsi, dans votre exemple, handler(someObject); appellera deux méthodes (Method1 Et Method2), Puisque vous avez créé un délégué avec ces deux cibles.

5
JacquesB

Désolé d'avoir ajouté à la réponse de quelqu'un d'autre, mais je pensais que les délégués étaient appelés dans l'ordre où ils étaient ajoutés.

Section "Délégués de multidiffusion"

http://msdn.Microsoft.com/en-us/library/orm-9780596527570-03-04.aspx

4
Lea Yates