Inleiding tot gebeurtenissen

Vorige

Gebeurtenissen zijn, zoals gemachtigden, een mechanisme voor late binding . Gebeurtenissen zijn gebaseerd op de taalondersteuning voor gemachtigden.

Gebeurtenissen zijn een manier om een object uit te zenden (naar alle geïnteresseerde onderdelen in het systeem) dat er iets is gebeurd. Elk ander onderdeel kan zich abonneren op de gebeurtenis en op de hoogte worden gesteld wanneer een gebeurtenis wordt gegenereerd.

U hebt waarschijnlijk gebeurtenissen gebruikt in een deel van uw programmering. Veel grafische systemen hebben een gebeurtenismodel om gebruikersinteractie te rapporteren. Deze gebeurtenissen rapporteren muisbewegingen, knopdrukken en vergelijkbare interacties. Dat is een van de meest voorkomende, maar zeker niet het enige scenario waarin gebeurtenissen worden gebruikt.

U kunt gebeurtenissen definiëren die moeten worden gegenereerd voor uw klassen. Een belangrijke overweging bij het werken met gebeurtenissen is dat er mogelijk geen object is geregistreerd voor een bepaalde gebeurtenis. U moet uw code schrijven zodat deze geen gebeurtenissen genereert wanneer er geen listeners zijn geconfigureerd.

Als u zich abonneert op een gebeurtenis, wordt ook een koppeling gemaakt tussen twee objecten (de gebeurtenisbron en de gebeurtenissink). U moet ervoor zorgen dat de gebeurtenissink zich afmeldt voor de gebeurtenisbron wanneer deze niet meer geïnteresseerd is in gebeurtenissen.

Ontwerpdoelen voor gebeurtenisondersteuning

Het taalontwerp voor gebeurtenissen is gericht op deze doelen:

  • Schakel zeer minimale koppeling tussen een gebeurtenisbron en een gebeurtenissink in. Deze twee onderdelen worden mogelijk niet geschreven door dezelfde organisatie en kunnen zelfs worden bijgewerkt volgens totaal verschillende planningen.

  • Het moet heel eenvoudig zijn om u te abonneren op een gebeurtenis en om u af te melden voor diezelfde gebeurtenis.

  • Gebeurtenisbronnen moeten meerdere gebeurtenisabonnees ondersteunen. Het moet ook ondersteuning bieden voor het toevoegen van geen abonnees van gebeurtenissen.

U kunt zien dat de doelen voor gebeurtenissen vergelijkbaar zijn met de doelen voor gemachtigden. Daarom is de ondersteuning voor de taal van de gebeurtenis gebaseerd op de ondersteuning voor de gedelegeerde taal.

Taalondersteuning voor gebeurtenissen

De syntaxis voor het definiëren van gebeurtenissen en het abonneren of afmelden van gebeurtenissen is een uitbreiding van de syntaxis voor gemachtigden.

Als u een gebeurtenis wilt definiëren, gebruikt u het event trefwoord:

public event EventHandler<FileListArgs> Progress;

Het type gebeurtenis (EventHandler<FileListArgs> in dit voorbeeld) moet een gemachtigde zijn. Er zijn een aantal conventies die u moet volgen bij het declareren van een gebeurtenis. Normaal gesproken heeft het type gebeurtenisdelegent een ongeldige retour. Gebeurtenisdeclaraties moeten een werkwoord of een woordgroep zijn. Gebruik afgelopen tijd wanneer de gebeurtenis iets rapporteert dat er is gebeurd. Gebruik een huidige tijdsverwoord (bijvoorbeeld Closing) om iets te melden dat op het punt staat te gebeuren. Vaak geeft het gebruik van de huidige gespannenheid aan dat uw klas een soort aanpassingsgedrag ondersteunt. Een van de meest voorkomende scenario's is het ondersteunen van annulering. Een Closing gebeurtenis kan bijvoorbeeld een argument bevatten dat aangeeft of de sluitingsbewerking moet worden voortgezet of niet. In andere scenario's kunnen bellers het gedrag wijzigen door eigenschappen van de gebeurtenisargumenten bij te werken. U kunt een gebeurtenis genereren om een voorgestelde volgende actie aan te geven die door een algoritme wordt uitgevoerd. De gebeurtenis-handler kan een andere actie vereisen door eigenschappen van het gebeurtenisargument te wijzigen.

Wanneer u de gebeurtenis wilt verhogen, roept u de gebeurtenis-handlers aan met behulp van de syntaxis van de gemachtigde-aanroep:

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

Zoals besproken in de sectie over gemachtigden, de ?. de operator maakt het eenvoudig om ervoor te zorgen dat u niet probeert de gebeurtenis te genereren wanneer er geen abonnees van die gebeurtenis zijn.

U abonneert u op een gebeurtenis met behulp van de += operator:

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

fileLister.Progress += onProgress;

De handlermethode heeft meestal het voorvoegsel 'Aan' gevolgd door de gebeurtenisnaam, zoals hierboven wordt weergegeven.

U kunt zich afmelden met behulp van de -= operator:

fileLister.Progress -= onProgress;

Het is belangrijk dat u een lokale variabele declareert voor de expressie die de gebeurtenis-handler vertegenwoordigt. Dit zorgt ervoor dat de handler wordt verwijderd door het afmelden. Als u in plaats daarvan de hoofdtekst van de lambda-expressie hebt gebruikt, probeert u een handler te verwijderen die nooit is gekoppeld, wat niets doet.

In het volgende artikel leert u meer over typische gebeurtenispatronen en verschillende variaties in dit voorbeeld.

Volgende