Die beiden folgenden Codezeilen sind nahezu äquivalent:
public event Action<EmployeeEventAgs> Leave;
im Gegensatz zu:
public event EventHandler<EmployeeEventAgs> Leave;
Der Unterschied liegt in der Signatur des Verfahrens Ereignisbehandlungsroutine. Wenn Sie den ersten Ansatz mit der Aktion verwenden, könnten Sie haben:
public void LeaveHandler(EmployeeEventAgs e) { ... }
und dann diese:
obj.Leave += LeaveHandler;
Mit dem zweiten Ansatz, die Unterzeichnung der LeaveHandler
Bedürfnisse anders sein:
public void LeaveHandler(object sender, EmployeeEventAgs e) { ... }
Es ist sehr wichtig zu bemerken th In beiden Fällen ist das Schlüsselwort event
vorhanden. Ein Ereignis, das über das Schlüsselwort event
explizit als solches deklariert wird, ist kein Feld der Klasse mehr. Stattdessen wird es eine Ereigniseigenschaft. Die Ereigniseigenschaften ähneln den regulären Eigenschaften, außer dass sie keine get
oder set
Accessoren haben. Der Compiler erlaubt es, sie nur auf der linken Seite einer +=
und -=
Zuweisung zu verwenden (Hinzufügen oder Entfernen eines Ereignishandlers). Es gibt keine Möglichkeit, überschreiben die bereits zugewiesenen Ereignishandler oder rufen Sie das Ereignis außerhalb der Klasse, die es deklariert.
Wenn das Ereignis Schlüsselwort wurde in beiden Beispielen fehlt, könnte man ohne Fehler oder Warnung die folgenden Operationen ausführen:
obj.Leave = LeaveHandler;
, die wird löschen Sie alle registrierten Handler und ersetzen sie die LeaveHandler
Withe.
Darüber hinaus können Sie auch diesen Anruf durchführen:
obj.Leave(new EmployeeEventAgs());
Die beiden oben genannten Beispiele gelten als ein anti-Muster, wenn Sie beabsichtigen, ein Ereignis zu erstellen. Ein Ereignis sollte nur durch das Objekt des Eigentümers aufgerufen werden und sollte nicht zulassen, nicht rückverfolgbar Entfernung von Abonnenten. Das Schlüsselwort event
ist das programmatische Konstrukt von .NET, das Ihnen hilft, bei der korrekten Verwendung von Ereignissen zu bleiben.
Ich denke, dass viele Leute bleiben mit dem EventHandler
Ansatz, weil es eher unwahrscheinlich ist, ein EventHandler
ohne das Schlüsselwort event
zu verwenden. Aktionen haben einen größeren Anwendungsbereich, sie sehen nicht so natürlich aus, wenn sie als Ereignisse verwendet werden. Letzteres ist natürlich eine persönliche Meinung, da der Event-Handler-Ansatz in meinen Programmierpraktiken wahrscheinlich zu stark verdrahtet ist. Wenn jedoch Aktionen richtig verwendet werden, ist es kein Verbrechen, sie für Ereignisse zu verwenden.
Das ist ein guter Ratschlag, aber ich glaube nicht, dass er die Frage beantwortet –
Haben Sie den 'Leave' -Handler als Delegat deklariert, anstatt: public __event__ EventHandler <> ... absichtlich? Das 'event'-Schlüsselwort ist ein Spiel, das sich verändert, wenn Sie mit der Klasse arbeiten, die das Ereignis ausgibt, denn ohne sie könnte man einfach die gesamte Ereignisauflistung löschen, indem Sie' obj.Leave = someHandler' statt 'obj.Leave + = someHandler verwenden ' –
Nein, das war ein Fehler. Niemand hat in drei Jahren bemerkt :) Danke! –