Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Simple Delegate (delegate) vs. Multicast delegates

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.

like image 257
A9S6 Avatar asked Feb 03 '10 13:02

A9S6


People also ask

What is delegate and multicast delegate?

The multicast delegate contains a list of the assigned delegates. When the multicast delegate is called, it invokes the delegates in the list, in order. Only delegates of the same type can be combined. The - operator can be used to remove a component delegate from a multicast delegate.

Why do we use multicast delegates?

Multicasting of delegate is an extension of the normal delegate(sometimes termed as Single Cast Delegate). It helps the user to point more than one method in a single call. Properties: Delegates are combined and when you call a delegate then a complete list of methods is called.

Are all delegates multicast?

Delegates in . NET are multicast delegates. Regardless of whether you choose to attach zero or one or several handlers to them, they are still multicast delegates.

What are the characteristics of multicast delegates?

A multicast delegate invokes the methods in the same order in which they are added. If the delegate has a return type other than void and if the delegate is a multicast delegate, then only the value of the last invoked method will be returned.


2 Answers

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! */ 
like image 58
Darin Dimitrov Avatar answered Sep 22 '22 12:09

Darin Dimitrov


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.

like image 37
Eric Lippert Avatar answered Sep 25 '22 12:09

Eric Lippert