Quando si programmano eventi in C #, si consiglia di creare un delegato in forma di:
delegate XEventHandler(object sender, XEventArgs e);
La mia domanda è sul primo argomento del delegato, object sender
. Dev'essere sempre un generico object
? Avere un mittente di tipo object
produce 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 strongmente tipizzati è che altri oggetti possono inoltrare l'evento senza preoccuparsi del tipo. Mentre questo potrebbe avere senso negli ambienti GUI, non sono sicuro che potrebbe trarne beneficio al di fuori di una GUI.
Cosa succede se la classe del mittente è sempre nota (almeno come una classe astratta)? Ad esempio, se sto implementando un evento ListChanged
in una classe List
astratta e se altre classi lo erediteranno (ad esempio LinkedList
, ArrayList
), è giusto definire il mio delegato con un mittente di tipo List
?
delegate ListChangedEventHander(List sender, ListChangedEventArgs e);
Oppure, ci sarebbe uno svantaggio nel cambiare il% convenzionaleobject sender
in un tipo più specifico?