tags:

views:

705

answers:

2

I have gone through many articles but I am still not clear about the difference between the normal delegates that we usually create and multicast delegates.

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

The above delegate MyMethodHandler will call these two methods. Now where does multicast delegates come in. I have read that they can call multiple methods but I am afraid that my basic understanding about delegates is not correct.

+2  A: 

This article explains it pretty well:

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!
*/
Darin Dimitrov
Are Multicast delegates nothing more than normal delegates that have multiple method references in their invocation list?
A9S6
Exactly. A multicast delegate will invoke multiple methods.
Darin Dimitrov
OK. Just to make it more clear: I declare a normal delegate and add a method ref to it, now this will be called a Singlecast delegate. I now add another method to the same delegate, this will now be referred as a multicast delegate?
A9S6
Delegates in .NET *are* multicast delegates (as far as I know). Regardless of whether you choose to attach zero or one or several handlers to them, they are still multicast delegates.
Fredrik Mörk
+3  A: 

The C# specification states that all delegate types must be convertible to System.Delegate. In fact the way the implementation implements this is that all delegate types are derived from System.MulticastDelegate, which in turn derives from System.Delegate.

Is that clear? I'm not sure that answered your question.

Eric Lippert
Yes Eric. Normally when I ask people(or people ask me) about delegates, we usually say there are two types of delegates-singlecast and multicast. Now I know that there is only one such things as a 'delegate' which can either be singlecast or multicast depending on the number of method references it contains.
A9S6