In general, delegates are useful for two main reasons.
First, delegates support events.
Second, delegates give your program a way to execute a method at runtime without having to know precisely what that method is at compile time.
This ability is quite useful when you want to create a framework that allows components to be plugged in. For example, imagine a drawing program (a bit like the standard Windows Paint accessory). Using a delegate, you could allow the user to plug in special color filters or image analyzers. Furthermore, the user could create a sequence of these filters or analyzers. Such a scheme would be easily handled using a delegate.