Difference between events and delegates and its respective applications
From the technical standpoint, other answers have addressed the differences.
From a semantics perspective, events are actions raised by an object when certain conditions are met. For example, my Stock class has a property called Limit, and it raises an event when the stock prices reaches the Limit. This notification is done via an event. Whether anyone actually cares about this event and subscribes to it is beyond the concern of the owner class.
A delegate is a more generic term to describe a construct similar to a pointer in C/C++ terms. All delegates in .Net are multicast delegates. From a semantics perspective, they are generally used as a kind of input. In particular, they are a perfect way to implement the Strategy Pattern. For example, if I want to sort a List of objects, I can provide a Comparator strategy to the method to tell the implementation how to compare two objects.
I have used the two methods in production code. Tons of my data objects notify when certain properties are met. Most basic example, whenever a property changes, a PropertyChanged event is raised (see INotifyPropertyChanged interface). I have used delegates in code to provide different strategies of turning certain objects into string. This particular example was a glorified ToString() list of implementations for a particular object type to display it to users.
The keyword event
is a scope modifier for multicast delegates. Practical differences between this and just declaring a multicast delegate are as follows:
- You can use
event
in an interface. - Invocation access to the multicast delegate is limited to the declaring class. The behaviour is as though the delegate were private for invocation. For the purposes of assignment, access is as specified by an explicit access modifier (eg
public event
).
As a matter of interest, you can apply +
and -
to multicast delegates, and this is the basis of the +=
and -=
syntax for the combination assignment of delegates to events. These three snippets are equivalent:
B = new EventHandler(this.MethodB);
C = new EventHandler(this.MethodC);
A = B + C;
Sample two, illustrating both direct assignment and combination assignment.
B = new EventHandler(this.MethodB);
C = new EventHandler(this.MethodC);
A = B;
A += C;
Sample three: more familiar syntax. You are probably acquainted with the assignment of null to remove all handlers.
B = new EventHandler(this.MethodB);
C = new EventHandler(this.MethodC);
A = null;
A += B;
A += C;
Like properties, events have a full syntax that no-one ever uses. This:
class myExample
{
internal EventHandler eh;
public event EventHandler OnSubmit
{
add
{
eh = Delegate.Combine(eh, value) as EventHandler;
}
remove
{
eh = Delegate.Remove(eh, value) as EventHandler;
}
}
...
}
...does exactly the same as this:
class myExample
{
public event EventHandler OnSubmit;
}
The add and remove methods are more conspicuous in the rather stilted syntax that VB.NET uses (no operator overloads).