Al programar eventos en C #, se recomienda crear un delegado en forma de:
delegate XEventHandler(object sender, XEventArgs e);
Mi pregunta es sobre el primer argumento del delegado, object sender
. ¿Siempre tiene que ser un genérico object
? Tener un remitente de tipo object
siempre da como resultado un código similar a este.
val = ((ConcreteType)sender).Property;
o, incluso más detallado,
ConcreteType obj = sender as ConcreteType
if (obj != null) { ... }
Un argumento contra los remitentes fuertemente tipados es que otros objetos pueden reenviar el evento sin preocuparse por el tipo. Si bien esto puede tener sentido en entornos de GUI, no estoy seguro de si podría beneficiarse fuera de una GUI.
¿Qué sucede si la clase del remitente siempre se conoce (al menos como una clase abstracta)? Por ejemplo, si estoy implementando un ListChanged
evento en una List
clase abstracta , y si otras clases lo van a heredar (por ejemplo LinkedList
, ArrayList
), ¿está bien definir mi delegado con un remitente de tipo List
?
delegate ListChangedEventHander(List sender, ListChangedEventArgs e);
O, ¿habría una desventaja de cambiar el convencional object sender
a un tipo más específico?