A delegate in C# is simlilar to function pointer in C or C++. Using a delegate allows the programmer to encapsulate a reference to a method inside a delegate object. The delegate object can then be passed to code which can call the referenced method with out having to know at compile time which method will be invoked. It doesn't know or care about the class of the object that references. All that matters is that the methods argument types and return type match the delegate.
A typical example of delegate usage can be found in event handling. For example when the event is raised that the selected index of a dropdown list changed we want method "ddlFoo_SelectedIndexChanged(object sender EventArgs e)" to be called.