Einführung in EreignisseIntroduction to Events

VorherigesPrevious

Ereignisse sind, wie Delegaten, ein Mechanismus mit später Bindung.Events are, like delegates, a late binding mechanism. In der Tat werden Ereignisse basierend auf der Sprachunterstützung für Delegaten erstellt.In fact, events are built on the language support for delegates.

Ereignisse sind eine Möglichkeit für ein Objekt (für alle interessierten Komponenten im System) weiterzugeben, dass etwas passiert ist.Events are a way for an object to broadcast (to all interested components in the system) that something has happened. Jede andere Komponente kann das Ereignis abonnieren, und benachrichtigt werden, wenn ein Ereignis ausgelöst wird.Any other component can subscribe to the event, and be notified when an event is raised.

Sie haben wahrscheinlich Ereignisse in einigen ihrer Programmierungen verwendet.You've probably used events in some of your programming. Viele grafische Systeme verfügen über ein Ereignismodell, um über Benutzerinteraktion zu berichten.Many graphical systems have an event model to report user interaction. Diese Ereignisse berichten über die Mausbewegung, das Betätigen der Schaltflächen und ähnliche Interaktionen.These events would report mouse movement, button presses and similar interactions. Dies ist eines der am häufigsten verwendeten, aber sicherlich nicht das einzige Szenario, in dem Ereignisse verwendet werden.That's one of the most common, but certainly not the only scenario where events are used.

Sie können Ereignisse, die für Ihre Klassen ausgelöst werden sollen, definieren.You can define events that should be raised for your classes. Ein wichtiger Aspekt bei der Arbeit mit Ereignissen ist, dass es möglicherweise kein registriertes Objekt für ein bestimmtes Ereignis gibt.One important consideration when working with events is that there may not be any object registered for a particular event. Sie müssen Ihren Code so schreiben, damit er keine Ereignisse auslöst, wenn keine Listener konfiguriert sind.You must write your code so that it does not raise events when no listeners are configured.

Das Abonnieren eines Ereignisses erstellt auch eine Kopplung zwischen zwei Objekten (die Ereignisquelle und die Ereignissenke).Subscribing to an event also creates a coupling between two objects (the event source, and the event sink). Sie müssen sicherstellen, dass sich die Ereignissenke von der Ereignisquelle abmeldet, wenn Sie nicht mehr an Ereignissen interessiert ist.You need to ensure that the event sink unsubscribes from the event source when no longer interested in events.

Entwurfsziele für die EreignisunterstützungDesign Goals for Event Support

Der Sprachentwurf für Ereignisse ist auf diese Ziele ausgerichtet.The language design for events targets these goals.

Aktivieren Sie zunächst eine sehr geringe Kopplung zwischen der Ereignisquelle und -senke.First, enable very minimal coupling between an event source and an event sink. Diese beiden Komponenten können nicht von derselben Organisation geschrieben werden und werden möglicherweise sogar auf völlig unterschiedliche Zeitpläne aktualisiert.These two components may not be written by the same organization, and may even be updated on totally different schedules.

Zweitens sollte es sehr einfach sein, ein Ereignis zu abonnieren, und sich von demselben Ereignis abzumelden.Secondly, it should be very simple to subscribe to an event, and to unsubscribe from that same event.

Und schließlich sollten Ereignisquellen mehrere Ereignisabonnenten unterstützen.And finally, event sources should support multiple event subscribers. Es sollte auch unterstützen, dass es keine angefügten Ereignisabonnenten gibt.It should also support having no event subscribers attached.

Sie sehen, dass die Ziele für Ereignisse, den Zielen für Delegaten sehr ähnlich sind.You can see that the goals for events are very similar to the goals for delegates. Deshalb basiert die Sprachunterstützung für Ereignisse auf der Sprachunterstützung für Delegaten.That's why the event language support is built on the delegate language support.

Sprachunterstützung für EreignisseLanguage Support for Events

Die Syntax zum Definieren von Ereignissen, und zum Abonnieren oder Abmelden von Ereignissen, ist eine Erweiterung der Syntax für Delegaten.The syntax for defining events, and subscribing or unsubscribing from events is an extension of the syntax for delegates.

Zum Definieren eines Ereignisses verwenden Sie das event-Schlüsselwort:To define an event you use the event keyword:

public event EventHandler<FileListArgs> Progress;

Der Typ des Ereignisses (EventHandler<FileListArgs> in diesem Beispiel) muss ein Delegattyp sein.The type of the event (EventHandler<FileListArgs> in this example) must be a delegate type. Es gibt eine Reihe von Konventionen, die Sie befolgen sollten, wenn Sie ein Ereignis deklarieren.There are a number of conventions that you should follow when declaring an event. Normalerweise verfügt der Delegattyp des Ereignisses über einen „void“-Rückgabetyp.Typically, the event delegate type has a void return. Ereignisdeklarationen sollten ein Verb oder eine Verbalphrase sein.Event declarations should be a verb, or a verb phrase. Verwenden Sie die Vergangenheitsform (wie in diesem Beispiel), wenn das Ereignis meldet, dass etwas geschehen ist.Use past tense (as in this example) when the event reports something that has happened. Verwenden Sie ein Gegenwartsverb (z.B. Closing) um etwas zu melden, das geschehen wird.Use a present tense verb (for example, Closing) to report something that is about to happen. Häufig gibt die Verwendung der Gegenwartsform an, dass die Klasse eine Art der Anpassung des Verhaltens unterstützt.Often, using present tense indicates that your class supports some kind of customization behavior. Eines der häufigsten Szenarios ist die Unterstützung des Abbruchs.One of the most common scenarios is to support cancellation. Angenommen, ein Closing-Ereignis enthält ein Argument, das angeben würde, ob der Schließvorgang fortgesetzt werden soll oder nicht.For example, a Closing event may include an argument that would indicate if the close operation should continue, or not. Andere Szenarios ermöglichen es Aufrufern, das Verhalten zu ändern, indem die Eigenschaften der Ereignisargumente aktualisiert werden.Other scenarios may enable callers to modify behavior by updating properties of the event arguments. Sie können ein Ereignis auslösen, um eine vorgeschlagene nächste Aktion anzugeben, die einen Algorithmus auslösen wird.You may raise an event to indicate a proposed next action an algorithm will take. Der Ereignishandler kann eine andere Aktion vorgeben, indem er die Eigenschaften des Ereignisarguments ändert.The event handler may mandate a different action by modifying properties of the event argument.

Wenn Sie das Ereignis auslösen möchten, rufen Sie mithilfe der Aufrufsyntax des Delegaten den Ereignishandler auf:When you want to raise the event, you call the event handlers using the delegate invocation syntax:

Progress?.Invoke(this, new FileListArgs(file));

Wie im Abschnitt unter Delegaten beschrieben, macht der ?.As discussed in the section on delegates, the ?. Operator es leicht, sicherzustellen, dass Sie nicht versuchen das Ereignis auszulösen, wenn keine Abonnenten für dieses Ereignis vorhanden sind.operator makes it easy to ensure that you do not attempt to raise the event when there are no subscribers to that event.

Sie abonnieren ein Ereignis mithilfe des +=-Operators:You subscribe to an event by using the += operator:

EventHandler<FileListArgs> onProgress = (sender, eventArgs) => 
    Console.WriteLine(eventArgs.FoundFile);
lister.Progress += OnProgress;

Die Handlermethode ist in der Regel das Präfix „On“ gefolgt vom Ereignisnamen, wie oben gezeigt.The handler method typically is the prefix 'On' followed by the event name, as shown above.

Sie melden sich mithilfe des -=-Operators ab:You unsubscribe using the -= operator:

lister.Progress -= onProgress;

Es ist wichtig, zu beachten, dass ich eine lokale Variable für den Ausdruck deklariert habe, der den Ereignishandler darstellt.It's important to note that I declared a local variable for the expression that represents the event handler. Damit wird sichergestellt, dass UNSUBSCRIBE den Handler entfernt.That ensures the unsubscribe removes the handler. Wenn Sie stattdessen den Text des Lambdaausdrucks verwendet haben, versuchen Sie einen Handler, der nicht angefügt wurde und nichts tut, zu entfernen.If, instead, you used the body of the lambda expression, you are attempting to remove a handler that has never been attached, which does nothing.

Im nächsten Artikel erfahren Sie mehr über das typische Ereignismuster und verschiedene Varianten dieses Beispiels.In the next article, you'll learn more about typical event patterns, and different variations on this example.

WeiterNext