Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ereignisse sind, wie Delegaten, ein Mechanismus mit später Bindung. Events basieren tatsächlich auf der Sprachunterstützung für Delegates.
Ereignisse sind eine Möglichkeit, um ein Objekt (an alle interessierten Komponenten im System) zu übertragen, was passiert ist. Jede andere Komponente kann das Ereignis abonnieren und benachrichtigt werden, wenn ein Ereignis ausgelöst wird.
Sie haben wahrscheinlich Ereignisse in einigen Ihrer Programme verwendet. Viele grafische Systeme verfügen über ein Ereignismodell, um die Benutzerinteraktion zu melden. Diese Ereignisse würden Mausbewegungen, Tastendrücke und ähnliche Interaktionen melden. Dies ist eines der häufigsten, aber nicht das einzige Szenario, in dem Ereignisse verwendet werden.
Sie können Ereignisse definieren, die für Ihre Klassen ausgelöst werden sollen. Ein wichtiger Aspekt beim Arbeiten mit Ereignissen ist, dass möglicherweise kein Objekt für ein bestimmtes Ereignis registriert ist. Sie müssen Ihren Code schreiben, damit er keine Ereignisse auslöst, wenn keine Listener konfiguriert sind.
Das Abonnieren eines Ereignisses erstellt auch eine Kopplung zwischen zwei Objekten (die Ereignisquelle und die Ereignissenke). Sie müssen sicherstellen, dass sich die Ereignissenke von der Ereignisquelle abmeldet, wenn Sie nicht mehr an Ereignissen interessiert ist.
Designziele für die Ereignisunterstützung
Das Sprachdesign für Ereignisse zielt auf diese Ziele ab:
- Ermöglichen Sie eine minimale Kopplung zwischen einer Ereignisquelle und einer Ereignissenke. Diese beiden Komponenten können von verschiedenen Organisationen geschrieben werden und können sogar in unterschiedlichen Zeitplänen aktualisiert werden.
- Es sollte einfach sein, ein Ereignis zu abonnieren und sich von diesem Ereignis abzumelden.
- Ereignisquellen sollten mehrere Ereignisabonnenten unterstützen. Es sollte auch unterstützen, dass es keine angefügten Ereignisabonnenten gibt.
Sie können sehen, dass die Ziele für Veranstaltungen den Zielen für Delegierte ähneln. Deshalb basiert die Sprachunterstützung für Ereignisse auf der Sprachunterstützung für Delegaten.
Sprachunterstützung für Ereignisse
Die Syntax zum Definieren von Ereignissen und Abonnieren oder Abbestellen von Ereignissen ist eine Erweiterung der Syntax für Delegaten.
Sie verwenden das event
Schlüsselwort zum Definieren eines Ereignisses:
public event EventHandler<FileFoundArgs>? FileFound;
Der Typ des Ereignisses (EventHandler<FileListArgs>
in diesem Beispiel) muss ein Delegatentyp sein. Es gibt Konventionen, die Sie beim Deklarieren eines Ereignisses befolgen sollten. Normalerweise verfügt der Delegattyp des Ereignisses über einen „void“-Rückgabetyp. Ereignisdeklarationen sollten ein Verb oder eine Verbphrase sein. Verwenden Sie die Vergangenheitsform, wenn das Ereignis etwas berichtet, das passiert ist. Verwenden Sie ein präsenses Verb (z. B Closing
. ), um etwas zu melden, das gerade passiert. Häufig weist die Verwendung des Präsens darauf hin, dass Ihre Klasse ein gewisses Anpassungsverhalten unterstützt. Eines der am häufigsten verwendeten Szenarien ist die Unterstützung der Abbruch. Angenommen, ein Closing
-Ereignis kann ein Argument enthalten, das angeben würde, ob der Schließvorgang fortgesetzt werden soll oder nicht. In anderen Szenarien können Aufrufer das Verhalten ändern, indem Eigenschaften der Ereignisargumente aktualisiert werden. Sie können ein Ereignis auslösen, um eine vorgeschlagene nächste Aktion anzuzeigen, die ein Algorithmus ausführen wird. Der Ereignishandler kann eine andere Aktion durch Ändern der Eigenschaften des Ereignisarguments mandaten.
Wenn Sie das Ereignis auslösen möchten, rufen Sie die Ereignishandler mithilfe der Stellvertretungsaufrufssyntax auf:
FileFound?.Invoke(this, new FileFoundArgs(file));
Wie im Abschnitt über Delegatesbeschrieben, können Sie mit dem Operator ?.
ganz einfach sicherstellen, dass Sie nicht versuchen, das Ereignis auszulösen, wenn es keine Abonnenten für dieses Ereignis gibt.
Sie abonnieren ein Ereignis mithilfe des +=
Operators:
var fileLister = new FileSearcher();
int filesFound = 0;
EventHandler<FileFoundArgs> onFileFound = (sender, eventArgs) =>
{
Console.WriteLine(eventArgs.FoundFile);
filesFound++;
};
fileLister.FileFound += onFileFound;
Die Handlermethode weist in der Regel das Präfix "On" gefolgt vom Ereignisnamen auf, wie im vorherigen Code gezeigt.
Sie kündigen das Abonnement mit dem -=
Betreiber:
fileLister.FileFound -= onFileFound;
Es ist wichtig, dass Sie eine lokale Variable für den Ausdruck deklarieren, der den Ereignishandler darstellt. Damit wird sichergestellt, dass UNSUBSCRIBE den Handler entfernt. Wenn Sie stattdessen den Körper des Lambda-Ausdrucks verwenden, versuchen Sie, einen Handler zu entfernen, der nie angehängt wurde, was nichts bringt.
Im nächsten Artikel erfahren Sie mehr über typische Ereignismuster und verschiedene Variationen in diesem Beispiel.