When programming events in C#, it is advised to create a delegate in form of:
delegate XEventHandler(object sender, XEventArgs e);
My question is on the first argument of the delegate, object sender
. Does it always have to be a generic object
? Having a sender of type object
always results in code similar to this.
val = ((ConcreteType)sender).Property;
or, even more verbose,
ConcreteType obj = sender as ConcreteType
if (obj != null) { ... }
One argument against strongly typed senders is that other objects can forward the event without worrying about the type. While this might make sense in GUI environments, I am not sure if it could benefit outside a GUI.
What if the class of the sender is always known (at least as an abstract class)? For example, if I am implementing a ListChanged
event in an abstract List
class, and if other classes are going to inherit it (e.g. LinkedList
, ArrayList
), is it all right to define my delegate with a sender of type List
?
delegate ListChangedEventHander(List sender, ListChangedEventArgs e);
Or, would there be a downside of changing the conventional object sender
to a more specific type?