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 object
comporta 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 ListChanged
evento in una List
classe 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 sender
in un tipo più specifico?