I have an article on pretty much exactly
In brief, you can think of an event as being a bit like a property – but instead of having get/set operations, it has add/remove. The value being added/removed is always a delegate reference.
Delegates themselves support operations of:
- Combine (chain multiple delegate instances together)
- Remove (split them up again)
- Invoke (synchronous or asynchronous)
- Various things to do with finding out the target, invocation list etc
Note that delegates themselves are immutable, so combine/remove operations return a new delegate instance rather than modifying the existing ones.