Delegates are fundamental to the .NET Framework (events and callbacks wouldn't work without them) and can be extremely powerful to the .NET Developer once they come to grasps with exactly what they are and how to use them. In this blog I will consider aspects of a real world situation in which delegates are useful, after which I will explain, in illustrative terms exactly what delegates are all about. You will see how delegates are an intrinsic part of the events structure in the .NET framework, but also why they are useful in their own right. First, though, we need to understand a little about the origins of delgates in the .NET framework.
…
Where one class may wants to be represented within another class it can use a delegate. This is a lot more efficient that passing itself to the other class in its entirety, and is a lot more flexible. The delegate has to conform to certain limitations, though, just as the real world delegate does.
When a delegate is declared it is declared much along the lines of a method/sub/function declaration. For example, in C#, a delegate declaration might look like:
public delegate void NewStaffCreatedHandler(StaffMember NewStaffMember)
It is given a scope public, a return type void (although it could equally be any other type), and specifies parameters. This constitutes the agreement as to how the implementation of the delegate (i.e. the method/sub/function it points to) must behave. In other words, any method/sub/function that this delegate points to must return a void and take a StaffMember object parameter.
The most common event handler delegate EventHandler, for example, has the following declaration:
public delegate void EventHandler(object sender, EventArgs e);
All events are of a delegate type. In other words, all events are declared with a specific delegate as their representative. For example, a delegate at a Microsoft conference could report back on an event that a delegate at an Sun conference couldn't (although they in turn could report back on an event that the Microsoft delegate couldn't), because they weren't in attendance at the same conference.
So, if you wanted to declare an event in your program that used the standard EventHandler delegate you would declare it as follows:
public event EventHandler MyEvent;
…
In essence, delegates allow one class to invoke code in another class, without necessarily needing to care where that code is, or even if it exists at all…
[http://www.codeproject.com/Articles/38716/ Delegates-Explained-in-Plain-English.aspx]
Note that this article does not recognize the role generics play with delegates.