Delen via


Evenementenontwerp

Opmerking

Deze inhoud wordt opnieuw afgedrukt met toestemming van Pearson Education, Inc. uit Framework Design Guidelines: Conventies, idioom en patronen voor herbruikbare .NET-bibliotheken, 2e editie. Die editie werd in 2008 gepubliceerd en het boek is sindsdien volledig herzien in de derde editie. Sommige informatie op deze pagina is mogelijk verouderd.

Gebeurtenissen zijn de meest gebruikte vorm van callbacks (constructies waarmee het framework gebruikerscode kan aanroepen). Andere callbackmechanismen omvatten leden die delegates accepteren, virtuele functies of methodes, en op interfaces gebaseerde invoegtoepassingen. Gegevens uit bruikbaarheidsstudies geven aan dat de meeste ontwikkelaars zich comfortabeler voelen bij het gebruik van gebeurtenissen dan bij het gebruik van de andere callbackmechanismen. Gebeurtenissen zijn mooi geïntegreerd met Visual Studio en veel talen.

Het is belangrijk te weten dat er twee groepen gebeurtenissen zijn: gebeurtenissen die worden gegenereerd vóór een status van de systeemwijzigingen, pregebeurtenissen genoemd, en gebeurtenissen die worden gegenereerd na een statuswijzigingen, postgebeurtenissen genoemd. Een voorbeeld van een voorgebeurtenis zou zijn Form.Closing, die wordt gegenereerd voordat een formulier wordt gesloten. Een voorbeeld van een postgebeurtenis is Form.Closed, dat wordt gegenereerd nadat een formulier is gesloten.

✔️ Gebruik de term 'oproepen' voor gebeurtenissen in plaats van 'afvuren' of 'activeren'.

✔️ Gebruik System.EventHandler<TEventArgs> in plaats van handmatig nieuwe delegates te maken die als event-handlers moeten worden gebruikt.

✔️ OVERWEEG een subklasse van EventArgs als gebeurtenisargument te gebruiken, tenzij u er absoluut zeker van bent dat de gebeurtenis nooit gegevens naar de methode voor gebeurtenisafhandeling hoeft te dragen. In dat geval kunt u het EventArgs type rechtstreeks gebruiken.

Als u een API EventArgs rechtstreeks verzendt, kunt u nooit gegevens toevoegen die met de gebeurtenis moeten worden meegenomen zonder de compatibiliteit te verbreken. Als u een subklasse gebruikt, zelfs als deze in eerste instantie volledig leeg is, kunt u indien nodig eigenschappen toevoegen aan de subklasse.

✔️ Gebruik een beveiligde virtuele methode om elke gebeurtenis te genereren. Dit is alleen van toepassing op niet-statische gebeurtenissen op niet-verzegelde klassen, niet op structs, verzegelde klassen of statische gebeurtenissen.

Het doel van de methode is om een manier te bieden voor een afgeleide klasse om de gebeurtenis af te handelen met behulp van een overschrijving. Overschrijven is een flexibelere, snellere en natuurlijkere manier om basisklassegebeurtenissen in afgeleide klassen te verwerken. Volgens de conventie moet de naam van de methode beginnen met 'Aan' en worden gevolgd door de naam van de gebeurtenis.

De afgeleide klasse kan ervoor kiezen om de basisimplementatie van de methode niet aan te roepen in de overschrijving. Wees hiervoor voorbereid door geen verwerking op te geven in de methode die vereist is om de basisklasse correct te laten werken.

✔️ Voer één parameter uit voor de beveiligde methode die een gebeurtenis genereert.

De parameter moet een naam e hebben en moet worden getypt als de gebeurtenisargumentklasse.

❌ GEEF NIET null door als de afzender bij het genereren van een niet-statische gebeurtenis.

✔️ GEEF null door als de afzender bij het genereren van een statische gebeurtenis.

❌ Geef null niet door als de parameter gebeurtenisgegevens bij het oproepen van een gebeurtenis.

U moet EventArgs.Empty doorgeven als u geen gegevens aan de gebeurtenisafhandelingsmethode wilt doorgeven. Ontwikkelaars verwachten dat deze parameter niet null is.

✔️ OVERWEEG gebeurtenissen te genereren die de eindgebruiker kan annuleren. Dit geldt alleen voor voorafgaande gebeurtenissen.

Gebruik System.ComponentModel.CancelEventArgs of de bijbehorende subklasse als gebeurtenisargument, zodat de eindgebruiker gebeurtenissen kan annuleren.

Ontwerp van aangepaste gebeurtenisafhandelaar

Er zijn gevallen waarin EventHandler<T> niet kan worden gebruikt, bijvoorbeeld wanneer het framework moet werken met eerdere versies van de CLR, die geen ondersteuning biedt voor Generics. In dergelijke gevallen moet u mogelijk een aangepaste event-handler gedelegeerde ontwerpen en ontwikkelen.

✔️ Gebruik een returntype van void voor gebeurtenishandlers.

Een gebeurtenis-handler kan meerdere methoden voor gebeurtenisafhandeling aanroepen, mogelijk op meerdere objecten. Als methoden voor gebeurtenisafhandeling een waarde zouden mogen retourneren, zouden er meerdere retourwaarden zijn voor elke aanroep van gebeurtenissen.

✔️ Gebruik object als het type van de eerste parameter van de event-handler en noem deze sender.

✔️ GEBRUIK System.EventArgs of de bijbehorende subklasse als het type van de tweede parameter van de gebeurtenis-handler en roep deze eaan.

❌ Heb niet meer dan twee parameters voor gebeurtenishandlers.

© Gedeelten 2005, 2009 Microsoft Corporation. Alle rechten voorbehouden.

Herdrukt door toestemming van Pearson Education, Inc. van Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, gepubliceerd 22 oktober 2008 door Addison-Wesley Professional als onderdeel van de Microsoft Windows Development Series.

Zie ook