A delegate is a pointer to a function.
As such, events are implemented internally using delegates, but that isn't the only thing they are used for, although that by far is the most visible and common use. Callback procedures (both synchronous and asynchronous) are another use. Other, perhaps more esoteric uses allow for a certain kind of polymorphism - different procedures can be called depending on run-time conditions using a delegate. Admittedly, this could be done any number of ways (e.g. IF/ELSE or SELECT CASE constructs), but a delegate is generally more efficient and certainly more

.
Note that the handles clause on a procedure in fact sets up a delegate behind the scenes for you - that's why you can use any name you choose for the event procedure - it's actually the delegate that establishes the link between your procedure and the event, unlike VB6 which required you to name an event procedure a certain way.
Note also that one procedure can handle multiple events from multiple sources, again all handled via the behind-the-scenes delegate.
Jeff Mason
Custom Apps, Inc.
www.custom-apps.com