When an event is signalled, there are two parameters which are passed through from the signaller to the handler:
sender
which indicates the class or control instance which generated the signal so you can have the same handler for five different buttons for example, and determine which button it was in the handler:
Button b = sender as Button;
if (b != null)
{
Console.WriteLine(b.Text);
}
And
e
which contains additional information about the event, and can be used as a basis for adding information that the handler needs.
The basic EventArgs has nothing particularly useful, and is often passed as null by signalling, but it can be extended by derivation to add information if it is needed.
Suppose for example you had a class which took a data feed of stock prices: You could have one instance for CompanyA and one for CompanyB, so the
sender
parameter would tell the handler which company to update, and you could extend the EventArgs to include the spot price: so when you got the event you could add the right data to the correct company. Even if the price changes very quickly, each time the event is signalled the actual data at that moment is preserved for the handler to work with.