C# Version 1
- Declaring a delegate is similar to defining a class, struct, or interface. That is, we can define it inside or outside a class.
- A delegate type specifies the parameter and return types that methods must have.
- A delegate instance contains a list of methods that each have an appropriate signature.
- We usually add methods to the invocation list with the += syntax.
- When we invoke a delegate instance, we invoke all of its methods and receive the return value of the final method.
- We stop invoking the method list if any method throws an exception.
- Methods stored in a delegates invocation list have access to the members of the class that defined the method.
- An event must be declared as a delegate type.
- We use += and -= to subscribe and unsubscribe to an event.
- When we do this, we are calling the Add/Remove methods on the event's delegate type.
C# in Depth, Third Edition, Jon Skeet