Ereignisentwurf
Hinweis
Diese Inhalte wurden mit Genehmigung von Pearson Education, Inc. aus Framework Design Guidelines nachgedruckt: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. Diese Ausgabe wurde 2008 veröffentlicht, und das Buch wurde seitdem in der dritten Ausgabe vollständig überarbeitet. Einige der Informationen auf dieser Seite sind möglicherweise veraltet.
Ereignisse sind die am häufigsten verwendete Form von Rückrufen (Konstrukte, die dem Framework das Aufrufen von Benutzercode ermöglichen). Andere Rückrufmechanismen beinhalten Member, die Delegaten annehmen, virtuelle Member und schnittstellenbasierte Plug-Ins. Daten aus Nutzbarkeitsstudien zeigen, dass die Mehrzahl der Entwickler die Verwendung von Ereignissen bequemer als die Verwendung anderer Rückrufmechanismen finden. Ereignisse sind gut in Visual Studio und viele Sprachen integriert.
Es ist wichtig zu beachten, dass es zwei Gruppen von Ereignissen gibt: Ereignisse, die ausgelöst werden, bevor sich ein Zustand des Systems ändert (als Prä-Ereignisse bezeichnet), und Ereignisse, die nach einer Zustandsänderung ausgelöst werden (als Post-Ereignisse bezeichnet). Ein Beispiel für ein Prä-Ereignis ist Form.Closing
, das vor dem Schließen eines Formulars ausgelöst wird. Ein Beispiel für ein Post-Ereignis ist Form.Closed
, das nach dem Schließen eines Formulars ausgelöst wird.
✔️ Verwenden Sie anstelle von „feuern“oder“triggern“ den Begriff „AUSLÖSEN“ für Ereignisse.
✔️ VERWENDEN Sie System.EventHandler<TEventArgs>, anstatt manuell neue Delegaten zu erstellen, die als Ereignishandler verwendet werden.
✔️ ERWÄGEN Sie die Verwendung einer Unterklasse von EventArgs als Ereignisargument, es sei denn, Sie sind sich absolut sicher, dass das Ereignis niemals Daten an die Ereignisverarbeitungsmethode übertragen muss. In diesem Fall können Sie den EventArgs
-Typ direkt verwenden.
Wenn Sie eine API ausliefern, die EventArgs
direkt verwendet, können Sie niemals Daten hinzufügen, die mit dem Ereignis übertragen werden, ohne die Kompatibilität zu verletzen. Wenn Sie eine Unterklasse verwenden, können Sie (auch wenn sie anfänglich vollständig leer ist) der Unterklasse bei Bedarf Eigenschaften hinzufügen.
✔️ VERWENDEN Sie eine geschützte virtuelle Methode verwenden, um die einzelnen Ereignisse auszulösen. Dies gilt nur für nicht statische Ereignisse in nicht versiegelten Klassen, nicht für Strukturen, versiegelte Klassen oder statische Ereignisse.
Der Zweck der-Methode besteht darin, eine Möglichkeit bereitzustellen, mit der eine abgeleitete Klasse das Ereignis mithilfe einer Außerkraftsetzung behandeln kann. Außerkraftsetzung ist eine flexiblere, schnellere und natürlichere Methode zum Verarbeiten von Basisklassenereignissen in abgeleiteten Klassen. Gemäß der Konvention sollte der Name der Methode mit „On“, gefolgt vom Namen des Ereignisses.
Die abgeleitete Klasse kann auswählen, die Basisimplementierung der Methode nicht in der Außerkraftsetzung aufzurufen. Seien Sie darauf vorbereitet, indem Sie keine Verarbeitung in die Methode einschließen, die für das ordnungsgemäße Funktionieren der Basisklasse erforderlich ist.
✔️ VERWENDEN Sie einen Parameter für die geschützte Methode, der ein Ereignis auslöst.
Der-Parameter sollte den Namen e
tragen und als Ereignisargumentklasse typisiert werden.
❌ Übergeben Sie NICHT NULL als Absender, wenn Sie ein nicht statisches Ereignis auslösen.
ÜBERGEBEN Sie NULL als Absender, wenn Sie ein statisches Ereignis auslösen.
❌ Übergeben Sie NICHT NULL als Ereignisdatenparameter, wenn Sie ein Ereignis auslösen.
Sie sollten EventArgs.Empty
übergeben, wenn Sie keine Daten an die Ereignisverarbeitungsmethode übergeben möchten. Entwickler erwarten, dass dieser Parameter nicht NULL ist.
✔️ ERWÄGEN Sie, Ereignisse auszulösen, die der Endbenutzer abbrechen kann. Dies gilt nur für den Prä-Ereignisse.
Verwenden Sie System.ComponentModel.CancelEventArgs oder die zugehörige Unterklasse als Ereignisargument, damit der Endbenutzer Ereignisse abbrechen kann.
Entwerfen eines benutzerdefinierten Ereignishandlers
Es gibt Fälle, in denen EventHandler<T>
nicht verwendet werden kann, z. B. wenn das Framework mit früheren Versionen der CLR arbeiten muss, die keine Generika unterstützt. In solchen Fällen müssen Sie möglicherweise einen benutzerdefinierten Ereignishandlerdelegaten entwerfen und entwickeln.
✔️ VERWENDEN Sie den Rückgabetyp „void“ für Ereignishandler.
Ein Ereignishandler kann mehrere Ereignisverarbeitungsmethoden aufrufen, möglicherweise für mehrere Objekte. Wenn Ereignisverarbeitungsmethoden einen Wert zurückgeben dürften, gäbe es mehrere Rückgabewerte für jeden Ereignisaufruf.
✔️ VERWENDEN Sie object
als Typ des ersten Parameters des Ereignishandlers, und nennen Sie ihn sender
.
✔️ VERWENDEN Sie System.EventArgs oder die zugehörige Unterklasse als Typ des zweiten Parameters des Ereignishandlers, und nennen Sie ihn e
.
❌ Verwenden Sie NICHT mehr als zwei Parameter für Ereignishandler.
Teile ©2005, 2009 Microsoft Corporation. Alle Rechte vorbehalten.
Nachdruck mit Genehmigung von Pearson Education, Inc aus Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition von Krzysztof Cwalina und Brad Abrams, veröffentlicht am 22. Oktober 2008 durch Addison-Wesley Professional als Teil der Microsoft Windows Development Series.