A delegate is a type, much like the C/C++ function pointer, that can reference or encapsulate any method with the same method signature as the delegate.
Declaring a delegate is like declaring a regular method but without the method body and using the delegate keyword.
// declaring a delegate that accepts string as input and returns void
public delegate void MyDelegate(string msg);
// declaring a method with similar method signature as the delegate
public static void MyDelegateMethod(string msg)
// instantiating the delegate
MyDelegate d = MyDelegateMethod;
// calling the delegate
The instantiated delegate is an object, and as such can be passed as a parameter or assigned to a property.
// here is a method accepting a delegate as a parameter
// the delegate parameter is often called the callback method
public static void PassMeTheDelegate(MyDelegate callBack)
callBack("Passed as a parameter");
// passing the instantiated delegate as a parameter to another method
// basically passing a callback method to another method
// assigning the instantiated delegate to another variable
MyDelegate v = d;
v("Assigned to a variable");
A delegate can call more than one method when invoked and this is referred to as multicasting, a feature extensively used in event handling.
// instantiate another delegate,
// encapsulating another method with same method signature
MyDelegate e = MyDelegateMethod2;
// to multicast, add the delegates using the addition operator
MyDelegate multiCast = d + e;
// invoking a multicast delegate will invoke
// each of the delegate methods in the invocation list
multiCast("I am multicasting!");
// and you can also remove a method from the invocation list
multiCast -= d;
multiCast("Now I am not");
Because delegates are derived from System.Delegate, you can call the methods and properties defined by that class on the delegate. Multicast delegates or delegates with more than one method in their invocation list derive from MulticastDelegate, which is a subclass of System.Delegate.
So far we have instantiated a delegate using a named method, where the method is defined elsewhere. Another way of instantiating a delegate is with anonymous methods and lambda expressions, both are forms of inline code that you can pass as parameter or assign to property in place of a named method, except that lambda expressions are more concise. Check out my post here on anonymous methods and lambda expressions.