Quando si programmano eventi in C #, si consiglia di creare un delegato sotto forma di:
delegate XEventHandler(object sender, XEventArgs e);
La mia domanda è sul primo argomento del delegato, object sender. Deve essere sempre un generico object? Avere un mittente di tipo objectcomporta sempre un codice simile a questo.
val = ((ConcreteType)sender).Property;
o, ancora più dettagliato,
ConcreteType obj = sender as ConcreteType
if (obj != null) { ... }
Un argomento contro mittenti fortemente tipizzati è che altri oggetti possono inoltrare l'evento senza preoccuparsi del tipo. Sebbene ciò possa avere senso negli ambienti con GUI, non sono sicuro che possa trarne beneficio al di fuori di una GUI.
Cosa succede se la classe del mittente è sempre conosciuta (almeno come una classe astratta)? Ad esempio, se sto implementando un ListChangedevento in una Listclasse astratta e se altre classi lo erediteranno (ad esempio LinkedList, ArrayList), va bene definire il mio delegato con un mittente di tipo List?
delegate ListChangedEventHander(List sender, ListChangedEventArgs e);
Oppure, ci sarebbe un aspetto negativo nel cambiare il convenzionale object senderin un tipo più specifico?