79 votes

Délégué simple (délégué) vs délégué à la multidiffusion

J'ai lu de nombreux articles mais je ne comprends toujours pas bien la différence entre les délégués normaux que nous créons habituellement et les délégués en 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. J'ai lu qu'ils pouvaient appeler plusieurs méthodes, mais je crains que ma compréhension de base des délégués ne soit pas correcte.

88voto

Darin Dimitrov Points 528142

Cet article l' explique plutôt 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!
*/
 

57voto

Eric Lippert Points 300275

La spécification C # stipule que tous les types de délégués doivent être convertibles en System.Delegate . En fait, l'implémentation est mise en œuvre de manière à ce que tous les types de délégués soient dérivés de System.MulticastDelegate , ce qui à son tour dérive de System.Delegate .

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

15voto

Michael.M Points 868

"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

4voto

Lea Yates Points 11

Désolé d'avoir ajouté à la réponse de quelqu'un d'autre, mais j'ai pensé que les délégués sont appelés dans l'ordre dans lequel ils ont été ajoutés.

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

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

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