Por ejemplo, tengo un método de evento de base editorial:.NET: ¿Está creando nuevos EventArgs cada vez que el evento desactive una buena práctica?
protected virtual OnSomeEvent(EventArgs e)
{
var handler = SomeEvent;
if (handler != null)
{
handler(this, e);
// handler(this, new EventArgs());// EDIT: Yes it should be
// handler(this, e),
// ignore this one :D
}
}
Para una clase derivada que anula OnSomeEvent
y provoca un evento adicional cuando se dispara:
protected override OnSomeEvent(EventArgs e)
{
base.OnSomeEvent(e);
if (ExtendedEvent != null)
{
OnExtendedEvent(e);
}
}
protected void OnExtendedEvent(EventArgs e)
{
// some stuff done
// new information the ExtendedEventArgs object needs
// is not available until this point
ExtendedEvent(this, new ExtendedEventArgs(someStuff, someOtherStuff));
}
Y si la derivación sigue así , creará un nuevo EventArgs derivado para cada generación de clase derivada que lo requiera. Sin embargo, parece que varias derivaciones de EventArgs
en .NET Framework no están diseñadas para ser mutables (no setters), esto desalienta a un objeto de mantener una sola instancia de EventArgs y modificarla a medida que avanza.
Así que cada vez que un evento como este se activa, volverá a asignar memoria para todos los objetos EventArgs
implicados. En una aplicación gráfica intensa donde un evento puede activarse docenas de veces por segundo (como el evento OnPaint
en un control), ¿es realmente una buena práctica?
¿Debo hacer algunos cambios en OnExtendedEvent()
y hacer ExtendedEventArgs
mutable entonces el siguiente es posible?
protected ExtendedEventArgs extendedArgs = ExtendedEventArgs.Empty;
protected void OnExtendedEvent(EventArgs e)
{
// some stuff done
// new information the ExtendedEventArgs object needs
// is not available until this point
extendedArgs.someProperty1 = someStuff;
extendedArgs.someProperty2 = someOtherStuff;
ExtendedEvent(this, extendedArgs);
}
EDITAR: corrigió el código de ejemplo, debería ser más claro ahora.
La derivación no es un problema, la clase derivada solo puede llamar a base.OnExtendedEvent con EventArgs.Empty. En general, no tengas miedo de crear basura de corta vida. –
Creo que te refieres a inmutable en lugar de mutable. Inmutable significa que no puedes cambiarlo. – aaronb