Warum verwenden EventArgs.Empty statt null?
Frage
Ich erinnere Lesen, mehrfach und an verschiedenen Orten, dass, wenn das typische Ereignis Brennen:
protected virtual OnSomethingHappened()
{
this.SomethingHappened(this, EventArgs.Empty);
}
e sollte EventArgs.Empty sein, wenn es keine interessante Veranstaltung args ist, nicht null.
Ich habe die Führung in meinem Code gefolgt, aber ich merke, dass ich nicht klar bin, warum das ist die bevorzugte Technik. Warum hat der angegebenen Vertrag bevorzugen EventArgs.Empty über null?
Lösung
ich glaube, die Argumentation hinter dem NOT NULL das ist, wenn als Parameter übergibt, wird nicht erwartet, dass das Verfahren, um möglicherweise benötigen eine NULL-Verweis Ausnahme zu behandeln.
Wenn Sie übergeben null, und die Methode versucht, etwas mit e zu tun, wird es eine Null-Referenz Ausnahme erhalten, mit EventArgs.Empty wird es nicht.
Andere Tipps
EventArgs.Empty
ist eine Instanz der Null-Objekt Muster .
Im Grunde ein Objekt mit „keinen Wert“ darstellt, für null zu vermeiden, überprüft, wenn es verwendet wird.
Ich glaube, EventArgs.Empty
verwendet wird, um die Konvention der Übergabe eines Arguments mit einem Ereignis zu halten, auch wenn keine erforderlich sind.
Mitchel Sellers geschrieben, die andere Hälfte meines Grund auf halbem Weg durch meinen Beitrag: es verhindert, dass ein NULL-Verweis Ausnahme sollte ein Verfahren versuchen und tun etwas mit diesem Argument (neben prüfen, ob es null)
. EventArgs.Empty
im Grunde macht die Arbeit eines global definierten Ereignis Argument ohne weitere Informationen.
Um ein ähnliches Beispiel für die Aufrechterhaltung einer Konvention zu geben, unser Team nutzt string.Empty
eine Zeichenfolge initialisiert werden, da sonst andere Programmierer newString = ""; or newString = " "; or newString = null;
verwenden könnte, die alle unterschiedliche Ergebnisse für verschiedene Kontrollbedingungen produzieren kann.
A (leicht pedantisch) Grund EventArgs.Empty
vs new EventArgs()
zu verwenden ist, dass erstere nicht einen neuen EventArgs
nicht initialisiert werden, eine geringe Menge an Speicher zu speichern.
Wenn Sie eine Allzweck Methode sind, die die EventHandler
Signatur hat, die von jedem Event-Handler genannt wird und übergeben wird sowohl die object sender
und EventArgs e
, kann es nennen e.ToString()
, zB für Veranstaltungen anmelden, ohne sich Gedanken über eine null-Zeiger-Ausnahme.
Ich habe lange Zeit „neue EventArgs ()“ statt „EventArgs.Empty“ ... ich glaube, das wichtig, etwas zu passieren ist, die eine Null-Ausnahme nicht verursacht.
von Albahari Buch: "in order to avoid unnecessarily instantiating an instance of EventArgs."