Zum Beispiel habe ich eine Basis Event-Publishing-Methode:.NET: Erzeugt jedes Mal, wenn das Ereignis eine gute Übung auslöst, neue EventArgs?
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
}
}
Für eine abgeleitete Klasse, die OnSomeEvent
und wirft ein zusätzliches Ereignis überschreibt, wenn er ausgelöst wird:
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));
}
Und wenn Ableitung geht wie folgt auf Es wird ein neues abgeleitete EventArgs für jede Generation der abgeleiteten Klasse, die es erfordert, erstellt. Es scheint jedoch, dass verschiedene Ableitungen von EventArgs
auf dem .NET-Framework nicht veränderbar sind (keine Setter), dies hält ein Objekt davon ab, eine einzige Instanz von EventArgs zu behalten und es so zu modifizieren, wie es geht.
Jedes Mal, wenn ein Ereignis wie dieses ausgelöst wird, wird es Speicher für alle beteiligten EventArgs
Objekte neu zuordnen. In einer grafikintensiven Anwendung, bei der ein Ereignis dutzende Male pro Sekunde ausgelöst werden kann (z. B. OnPaint
Ereignis auf einem Steuerelement), ist das wirklich eine gute Übung?
Sollte ich einige Änderungen an OnExtendedEvent()
vornehmen und ExtendedEventArgs
veränderbar machen, damit folgendes möglich ist?
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);
}
BEARBEITEN: Der Beispielcode behoben, sollte jetzt klarer sein.
Die Ableitung ist kein Problem, die abgeleitete Klasse kann base.OnExtendedEvent nur mit EventArgs.Empty aufrufen. Im Allgemeinen haben Sie keine Angst, kurzlebigen Müll zu erstellen. –
Ich denke du meinst unveränderlich statt veränderbar. Unveränderbar bedeutet, dass Sie es nicht ändern können. – aaronb