Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Händelser är, som ombud, en sen bindning mekanism. Faktum är att händelser bygger på språkstöd för delegater.
Händelser är ett sätt för ett objekt att sända (till alla intresserade komponenter i systemet) att något hände. Alla andra komponenter kan prenumerera på händelsen och meddelas när en händelse aktiveras.
Du använde förmodligen händelser i en del av din programmering. Många grafiska system har en händelsemodell för att rapportera användarinteraktion. Dessa händelser rapporterar musrörelser, knapptryckningar och liknande interaktioner. Det är ett av de vanligaste, men inte det enda scenariot där händelser används.
Du kan definiera händelser som ska aktiveras för dina klasser. En viktig faktor när du arbetar med händelser är att det kanske inte finns något objekt registrerat för en viss händelse. Du måste skriva koden så att den inte genererar händelser när inga lyssnare har konfigurerats.
När du prenumererar på en händelse skapas också en koppling mellan två objekt (händelsekällan och händelsemottagaren). Du måste se till att händelsens mottagare avregistrerar sig från händelsekällan när den inte längre är intresserad av händelser.
Designmål för händelsesupport
Språkdesignen för händelser är inriktad på följande mål:
- Aktivera minimal koppling mellan en händelsekälla och en händelsemottagare. Dessa två komponenter kan skrivas av olika organisationer och kan till och med uppdateras enligt olika scheman.
- Det ska vara enkelt att prenumerera på en händelse och att avbryta prenumerationen på samma händelse.
- Händelsekällor bör stödja flera händelseprenumeranter. Det bör också ha stöd för att inga händelseprenumeranter är anslutna.
Du kan se att målen för evenemang är liknande de för ombud. Därför bygger stöd för händelsespråket på stöd för ombudsspråk.
Språkstöd för händelser
Syntaxen för att definiera händelser och prenumerera eller avprenumerera från händelser är en förlängning av syntaxen för ombud.
Du använder nyckelordet event för att definiera en händelse:
public event EventHandler<FileFoundArgs>? FileFound;
Typen av händelse (EventHandler<FileListArgs> i det här exemplet) måste vara en delegattyp. Det finns konventioner som du bör följa när du deklarerar en händelse. Vanligtvis har händelsedelegattypen en void-återgång. Händelsedeklarationer ska vara ett verb eller en verbfras. Använd tidigare tempus när händelsen rapporterar något som hände. Använd ett aktuellt tempusverb (till exempel Closing) för att rapportera något som håller på att hända. Att använda presens indikerar ofta att din klass stöder någon form av anpassningsbeteende. Ett av de vanligaste scenarierna är att stödja annullering. En Closing händelse kan till exempel innehålla ett argument som anger om stängningsåtgärden ska fortsätta eller inte. Andra scenarier gör det möjligt för anropare att ändra beteendet genom att uppdatera egenskaperna för händelseargumenten. Du kan skapa en händelse för att ange en föreslagen nästa åtgärd som en algoritm ska vidta. Händelsehanteraren kan kräva en annan åtgärd genom att ändra egenskaperna för händelseargumentet.
När du vill skapa händelsen anropar du händelsehanterarna med hjälp av syntaxen för delegerat anrop:
FileFound?.Invoke(this, new FileFoundArgs(file));
Enligt beskrivningen i avsnittet om ombudgör ?.-operatorn det enkelt att se till att du inte försöker utlösa händelsen när det inte finns några prenumeranter på händelsen.
Du prenumererar på en händelse med hjälp av operatorn +=:
var fileLister = new FileSearcher();
int filesFound = 0;
EventHandler<FileFoundArgs> onFileFound = (sender, eventArgs) =>
{
    Console.WriteLine(eventArgs.FoundFile);
    filesFound++;
};
fileLister.FileFound += onFileFound;
Hanteringsmetoden har vanligtvis prefixet "På" följt av händelsenamnet, enligt föregående kod.
Du avbryter prenumerationen med operatorn -=:
fileLister.FileFound -= onFileFound;
Det är viktigt att du deklarerar en lokal variabel för uttrycket som representerar händelsehanteraren. Det säkerställer att avregistreringen tar bort hanteraren. Om du i stället använde lambda-uttryckets brödtext försöker du ta bort en hanterare som aldrig var kopplad, vilket inte gör någonting.
I nästa artikel får du lära dig mer om typiska händelsemönster och olika variationer i det här exemplet.