Per esempio, Ho un metodo di base dell'editoria evento:. NET: la creazione di nuovi eventi ogni volta che l'evento genera una buona pratica?
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
}
}
Per una classe derivata che prevale su OnSomeEvent
e genera un evento aggiuntivo quando si spara:
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));
}
E se derivazione continua così , creerà un nuovo EventArgs derivato per ogni generazione di classe derivata che lo richiede. Tuttavia sembra che le varie derivazioni di EventArgs
nel framework .NET non siano progettate per essere mutabili (nessun setter), questo scoraggia un oggetto dal mantenere una singola istanza di EventArgs e modificarlo man mano che procede.
Quindi ogni volta che si attiva un evento come questo, viene riallocata la memoria per tutti gli oggetti coinvolti EventArgs
. In un'applicazione grafica intensa in cui un evento può essere attivato decine di volte al secondo (come ad esempio l'evento OnPaint
su un controllo), è davvero una buona pratica?
Devo apportare alcune modifiche a OnExtendedEvent()
e rendere modificabile ExtendedEventArgs
in modo che quanto segue sia possibile?
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);
}
MODIFICA: corretto il codice di esempio, ora dovrebbe essere più chiaro.
Derivazione non è un problema, la classe derivata può solo chiamare base.OnExtendedEvent con EventArgs.Empty. In generale, non aver paura di creare spazzatura di breve durata. –
Penso che tu intenda immutabile invece che mutabile. Immutabile significa che non puoi cambiarlo. – aaronb