2012-05-24 1 views
6

Mögliche Duplizieren:
Is there a downside to adding an anonymous empty delegate on event declaration?Ist es OK, immer einen leeren Event-Handler hinzuzufügen?

Das folgende Muster ist durchaus üblich, wenn Event-Handler mit (in C#):

public event Action handler; 
… 
// some method: 
if(handler != null) handler(); 

Gibt es irgendwelche Nachteile eines leeren Zuordnung Delegieren Sie zu dieser Veranstaltung? Dies würde den Zustand if !=null überall dort speichern, wo das Ereignis ausgelöst wird. Dies gilt natürlich nur dann, wenn wir nicht garantieren können, dass dem Ereignis immer ein geeigneter Delegierter zugewiesen wird.

Sicher, es gibt einen leichten Leistungseinbruch, aber es macht den Code viel sauberer. Was ist die beste Vorgehensweise in einem solchen Fall? Irgendwelche technischen Nachteile?

+0

Aus meiner Sicht ist keine gute Praxis. Ja, Sie speichern eine Nullprüfung, aber ein paar Monate später, wenn Sie den Code auf Fehler oder Wartung untersuchen, demonstriert das erste Beispiel den Zweck des Codes. – Steve

+1

Es wird sogar noch schlimmer - ohne Schutz kann der "Handler" zwischen dem Prüfen auf Null und dem Aufrufen auf null gesetzt werden. Sie sollten den Wert von 'handler' in eine lokale Variable kopieren und _that_ für null überprüfen. –

+0

Ihr erster Code ist fehlerhaft, da Sie den Wert von 'handler' nicht in eine lokale Variable kopieren. – CodesInChaos

Antwort

1

Anstatt einen leeren Delegaten im Konstruktor hinzuzufügen, können Sie den Handler in eine Funktion einfügen, die zuerst prüft, ob der Handler null ist, und dann aufruft. Der Nachteil davon ist, wenn Sie viele Ereignisse haben, haben Sie viele Funktionen, die jedes Ereignis umhüllen.

private void HandlerWrapper() 
{ 
    Action localHandler = handler; 
    if (localHandler != null) handler(); 
} 
+1

gleichen Thread Sicherheitsprobleme wie der ursprüngliche Code – CodesInChaos

1

Interessante Idee, ich habe nie daran gedacht, das zu tun. Die Art und Weise, wie ich meine benutzerdefinierten Ereignisse mache, ist, dass ich einen OnCustomEventName mache, der Parameter für das Ereignis nimmt, und führe einfach das Einchecken für null durch. und rufen Sie OnCustomEventName aus dem Code auf, an dem das Ereignis ausgelöst werden soll. Vermeidet Leistungseinbußen und hält den Betriebscode sauberer als eine 2-Zeilen-Prüfung, wenn jedes Mal geprüft wird, wann das Ereignis ausgelöst werden soll.

Das heißt, dies beantwortet nicht die Frage nach technischen Nachteilen, sondern eher eine Best Practice beim Abfeuern von Ereignissen.

Beispielcode für threadsafe "On" -Funktion.

0

Ich habe nicht wirklich irgendwelche großen Nachteile gefunden, um dies zu tun und im Allgemeinen bevorzuge ich es über die Überprüfung auf Null. Das einzige Problem, an das ich nicht denken kann, ist, dass es beim Debuggen zu lästigen Schritten im Code führen kann (d. H. muss immer über den leeren Delegaten treten, wenn er in ein Ereignis eintritt).

Ich denke, dass die Leistung kein Problem ist - wenn die Anwendungsleistung durch das Aufrufen von Ereignissen erheblich degeneriert, sollte das Ereignis wahrscheinlich nicht an erster Stelle gewesen sein.