Warum haben Ereignisse in .NET keine Rückgabetypen?

7

Ereignisse "tun" auch etwas wie Methoden, aber sie haben keine Rückgabetypen und nur Leerstellen?

Ich bin neugierig zu wissen, warum ist es so? und warum geben sie keine Typen zurück?

    
Dhana 29.05.2009, 06:44
quelle

6 Antworten

22

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.

    
Josh 29.05.2009, 06:48
quelle
8

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%     
Marc Gravell 29.05.2009 06:58
quelle
3

Sie müssen nicht. Denk darüber nach. Was würden sie zurückgeben?

    
Sasha Chedygov 29.05.2009 06:49
quelle
0

Das Auslösen eines Ereignisses ist ein Einwegsignal. Sie werden meist verwendet, um eine lockere Kopplung zu erreichen, da der Aufsteiger des Events keine Abhängigkeit vom Konsumenten hat. Ein Rückgabewert würde eine Abhängigkeit vom Konsumenten erzeugen.

    
Vizu 29.05.2009 06:55
quelle
0

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.

    
S M Kamran 29.05.2009 07:02
quelle
-2

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.

    
ChrisBD 29.05.2009 06:52
quelle

Tags und Links