c# - eventos - ¿Hay una asociación especial entre la clase EventArgs y la palabra clave del evento?
eventos en c# ejemplos (3)
En todo el libro de .NET que he leído, la guía para la implementación de eventos explica que es necesario EventArgs
subclase de EventArgs
y usar EventHandler. Busqué más información en http://msdn.microsoft.com/en-us/library/ms229011.aspx y dice "Use System.EventHandler en lugar de crear delegados nuevos manualmente para usarlos como controladores de eventos". Entiendo que hay razones importantes para usar EventArgs, pero mi pregunta no es "¿Debo hacerlo de esta manera?", Sino "¿Puedo hacerlo de esta manera?".
¿Hay alguna razón por la que no pueda usar un delegado genérico en lugar de un EventHandler
con mis eventos? Por ejemplo, si quiero un remitente fuertemente tipado (¿alguien más se molesta por ese object sender
?).
Para explicar mejor lo que quiero decir, ¿hay alguna razón para que lo siguiente no funcione?
public class IoC
{
public AbstractFactory GetAbstractFactory()
{
var factory = new AbstractFactory();
factory.CreateObject += ()=>new object();
return factory;
}
}
public class AbstractFactory
{
public event Func<object> CreateObject;
private object OnObjectCreated()
{
if(CreateObject == null)
{
throw new Exception("Not injected.");
}
return CreateObject();
}
private object _injectedObject;
public object InjectedObject
{
get
{
if(_injectedObject == null)
{
_injectedObject = OnObjectCreated();
}
return _injectedObject;
}
}
}
Es solo una convención, y ningún requisito del idioma. Puede usar cualquier tipo de delegado como un evento.
La firma estándar EventHandler<T>
tiene algunas ventajas sin embargo:
- Puede extender el parámetro
EventArgs
. Esto no funcionaría si tuviera un parámetro para cada cosa que desea pasar al controlador de eventos. - Un EventHandler que acepta la
EventArgs
baseEventArgs
puede suscribirse a cualquier evento que siga a la convención - Puede agregar métodos de extensión a
EventHandler<T>
que aparecen en todos los eventos. - El tipo de devolución es
void
. Otros tipos de devolución no tienen mucho sentido como eventhandlers. - Estás siguiendo la convención. Seguir la convención suele ser una buena idea, a menos que tenga argumentos convincentes para no hacerlo.
Hasta donde yo sé, EventHandler y EventArgs son las mejores prácticas, pero no hay nada que te impida usar cualquier delegado arbitrario en una declaración de evento. La palabra clave event le otorga la funcionalidad especial de poder + = y - = delegar en el espacio del evento, en lugar de simplemente tener un campo o propiedad del tipo de delegado, que solo aceptará un único delegado (a menos que componga varios delegados) tú mismo).
Advertencia: no estoy seguro de qué sucede con los delegados con valores devueltos en un espacio de evento. Supongo que los valores de retorno se descartan, ya que sería difícil manejar delegados múltiples con valores devueltos asignados al evento. Esto requeriría algo de experimentación sin embargo.
Toda la documentación de Microsoft trata sobre el diseño de las bibliotecas de la clase base y / o las pautas generales de diseño del marco. Puedes usar cualquier patrón que desees.
Dicho esto, si las personas consumirán su código, les resultará más familiar si sigue los patrones que usa Microsoft.