Weil Ereignisse von mehreren Listenern verarbeitet werden können. Es gibt keine garantierte Reihenfolge für die Event-Handler (obwohl ich denke, dass sie in der Reihenfolge aufgerufen werden, in der sie tatsächlich abonniert sind.)
Für Ereignisse, die einige Daten "zurückgeben" möchten, muss stattdessen ein veränderbares EventArgs-Objekt wie CancelEventArgs vorhanden sein, bei dem die Cancel-Eigenschaft auf true festgelegt werden kann. Der Vorteil gegenüber einem Rückgabewert ist, dass Event-Handler in der Kette die Eigenschaft betrachten können, um zu sehen, ob ein anderer Handler sie bereits gesetzt hat. Aber Sie kommen immer noch mit einer Situation, in der der letzte, um die Eigenschaft zu setzen, gewinnt.
Wenn es ein Rückgabewert wäre, wäre das ganze Konzept viel komplizierter.
Tatsächlich können Ereignisse Rückgabewerte haben ; Einfach, es ist keine gute Idee, da es eine komplexere Verarbeitung erfordert, wenn es mehrere Listener gibt ... häufiger gibt es eine einstellbare Eigenschaft und eine EventArgs
Unterklasse.
Aber hier ist ein Beispiel für die Verwendung von Rückgabewerten mit Ereignissen; das ist nicht normalerweise eine gute Idee; nur zur Information:
%Vor%Sie müssen nicht. Denk darüber nach. Was würden sie zurückgeben?
Es ist im Entwurf des Ereignissystems ... Der Hauptzweck des Ereignissystems ist Mitteilung nicht Bestätigung.
Event ist eine Möglichkeit, seinen Listenern (Beobachtern) mitzuteilen, dass eine signifikante Aktion stattgefunden hat. Es ist nicht so konzipiert, dass es den Zuhörern nicht nur mitteilt, dass eine signifikante Aktion stattgefunden hat, sondern auch der Ereignisquelle, dass es was ist. behandelt werden ??? oder sonst ... Wie entscheidest du was zu tun ???
Wenn ein Ereignis einen Wert zurückgeben muss, an dem es zurückgegeben würde, wenn ihm kein Handler zugeordnet ist. Was ist, wenn ein Ereignis mehrere Handler hat ... Dann, wie man entscheidet, welcher Handler-Wert zurückgegeben werden soll.
Vor allem können diese Ereignisse Werte zurückgeben. Obwohl es keine Best Practice ist.
Dies liegt daran, dass ein Event ein asynchroner Aufruf ist. Sie können mehrere Kopien desselben Ereignisses gleichzeitig verarbeiten lassen.
Daher übergeben sie nur Informationen, um einen Rückgabetyp zu verarbeiten, den der Ereigniserweiterer synchronisieren müsste, und auf den Abschluss des Ereignishandlers zu warten. Dies würde es wie jeden anderen Prozeduraufruf machen.