Voy a mover el barco aquí y propondré algo completamente herético. Solía estar firmemente en el campo EventArgs
porque me aferré a la mentalidad de "MS recomienda esto y siempre se ha hecho así", pero con el tiempo llegué a odiar EventArgs
. ¿Por qué?
- promueve un estilo de NET-1.0ish de codificación que se basa en la tipificación débil la conversión de tipos/y me hace sentir sucia.
- Obliga a su clase que implementa el evento a contaminar el montón con nuevas instancias
EventArg
cada vez que se dispara, lo que también me inquieta. ¿Por qué no hacer que mis eventos les den a los suscriptores exactamente lo que necesitan en lugar de completarlo en una clase extra que no hace nada por mí?
- Las firmas de sus métodos de devolución de llamada que se suscriben al evento se ven como basura y tienen muy pocos detalles semánticos, por ej.
object sender
- ¿QUÉ es remitente?!?!
Lo que hago ahora es declarar mis propios delegados de controladores de eventos, que guardo cuidadosamente en su propia carpeta de "delegados" en mi solución, así como su propio espacio de nombres. Así que mi delegado puede residir en su propio archivo de la siguiente manera:
namespace MyAPI.Data.Delegates
{
public delegate void DataEventHandler<TData>(DataFeed<TData> sender, TData data);
}
La declaración evento ahora se ve así:
public event DataEventHandler<TData> DataReady = delegate { };
Los beneficios de este enfoque:
- firmas método tienen más semántica detalle. Usted sabe WHO está enviando LO QUE.
- Strong-typing se conserva. No más casting
object sender
a lo que crees que debería ser.
- No necesita
new()
levantar objetos y contaminar el montón, lo que puede ser problemático si su evento se dispara con frecuencia. Simplemente pase sus suscriptores exactamente lo que necesitan, ya sea una referencia de objeto o un tipo de valor.
- Al utilizar la convención de nomenclatura
___EventHandler
para sus delegados, aún promueve un estilo uniforme para su código, lo que facilita a los usuarios de su API saber cuál es su intención.
El único "inconveniente" es que dificulta a los usuarios de su código cablear su evento a los métodos existentes que tienen la firma object sender, EventArgs e
. Sin embargo, este punto es discutible porque si su evento proporciona datos adicionales (por ejemplo, usted creó su propia subclase EventArgs
), entonces tendrán que cambiar la firma del método de todos modos (o emitir a su tipo de subclase). De cualquier manera, eso sigue siendo desagradable.
Es por eso que me gusta mi camino.
gracias a todos por su ayuda – flockofcode