Explain Delegates

A delegate is a type safe function pointer, it holds a reference to a function. The signature of the delegate must match the signature of the function, the delegate points to. A delegate is similar to a class and we can create an instance of it. Delegates are mainly used for communication and callbacks.
Delegates provide two way communication.

We can use multi cast delegates when we need to reference more than one function. When we invoke a multi-cast delegate, all the functions the delegate is pointing to, are invoked.