Share via


Abonneren op en afmelden voor gebeurtenissen (C#-programmeerhandleiding)

U abonneert u op een gebeurtenis die door een andere klasse wordt gepubliceerd wanneer u aangepaste code wilt schrijven die wordt aangeroepen wanneer deze gebeurtenis wordt gegenereerd. U kunt zich bijvoorbeeld abonneren op de gebeurtenis van click een knop om ervoor te zorgen dat uw toepassing iets nuttigs doet wanneer de gebruiker op de knop klikt.

Abonneren op gebeurtenissen met behulp van de Visual Studio IDE

  1. Als u het venster Eigenschappen niet ziet, klikt u in de ontwerpweergave met de rechtermuisknop op het formulier of besturingselement waarvoor u een gebeurtenis-handler wilt maken en selecteert u Eigenschappen.

  2. Klik boven op het venster Eigenschappen op het pictogram Gebeurtenissen .

  3. Dubbelklik op de gebeurtenis die u wilt maken, bijvoorbeeld de Load gebeurtenis.

    Visual C# maakt een lege methode voor gebeurtenis-handler en voegt deze toe aan uw code. U kunt de code ook handmatig toevoegen in de codeweergave . De volgende regels code declareren bijvoorbeeld een gebeurtenishandlermethode die wordt aangeroepen wanneer de klasse de FormLoad gebeurtenis genereert.

    private void Form1_Load(object sender, System.EventArgs e)
    {
        // Add your form load event handling code here.
    }
    

    De coderegel die is vereist om u te abonneren op de gebeurtenis, wordt ook automatisch gegenereerd in de InitializeComponent methode in het Form1.Designer.cs-bestand in uw project. Deze ziet er ongeveer als volgt uit:

    this.Load += new System.EventHandler(this.Form1_Load);  
    

Programmatisch abonneren op gebeurtenissen

  1. Definieer een gebeurtenishandlermethode waarvan de handtekening overeenkomt met de handtekening voor de gedelegeerde voor de gebeurtenis. Als de gebeurtenis bijvoorbeeld is gebaseerd op het EventHandler type gemachtigde, vertegenwoordigt de volgende code de methode-stub:

    void HandleCustomEvent(object sender, CustomEventArgs a)  
    {  
       // Do something useful here.  
    }  
    
  2. Gebruik de operator voor het toevoegen van toewijzingen (+=) om een gebeurtenis-handler aan de gebeurtenis toe te voegen. In het volgende voorbeeld wordt ervan uitgegaan dat een object met de naam publisher een gebeurtenis heeft met de naam RaiseCustomEvent. Houd er rekening mee dat de abonneeklasse een verwijzing naar de uitgeversklasse nodig heeft om zich te abonneren op de gebeurtenissen.

    publisher.RaiseCustomEvent += HandleCustomEvent;  
    

    U kunt ook een lambda-expressie gebruiken om een gebeurtenis-handler op te geven:

    public Form1()  
    {  
        InitializeComponent();  
        this.Click += (s,e) =>
            {
                MessageBox.Show(((MouseEventArgs)e).Location.ToString());
            };
    }  
    

Abonneren op gebeurtenissen met behulp van een anonieme functie

Als u zich later niet hoeft te afmelden voor een gebeurtenis, kunt u de operator voor het toevoegen van toewijzingen (+=) gebruiken om een anonieme functie als gebeurtenis-handler toe te voegen. In het volgende voorbeeld wordt ervan uitgegaan dat een object met de naam publisher een gebeurtenis heeft RaiseCustomEvent en dat er ook een CustomEventArgs klasse is gedefinieerd om bepaalde gespecialiseerde gebeurtenisgegevens te bevatten. Houd er rekening mee dat de abonneeklasse een verwijzing publisher nodig heeft om zich te abonneren op de gebeurtenissen.

publisher.RaiseCustomEvent += (object o, CustomEventArgs e) =>
{  
  string s = o.ToString() + " " + e.ToString();  
  Console.WriteLine(s);  
};  

U kunt zich niet eenvoudig afmelden voor een gebeurtenis als u een anonieme functie hebt gebruikt om u erop te abonneren. Als u zich wilt afmelden in dit scenario, gaat u terug naar de code waarin u zich abonneert op de gebeurtenis, slaat u de anonieme functie op in een gemachtigdevariabele en voegt u de gemachtigde vervolgens toe aan de gebeurtenis. We raden u aan anonieme functies niet te gebruiken om u te abonneren op gebeurtenissen als u zich op een later moment in uw code moet afmelden voor de gebeurtenis. Zie Lambda-expressies voor meer informatie over anonieme functies.

Afmelden

Als u wilt voorkomen dat uw gebeurtenis-handler wordt aangeroepen wanneer de gebeurtenis wordt gegenereerd, moet u zich afmelden voor de gebeurtenis. Als u resourcelekken wilt voorkomen, moet u zich afmelden voor gebeurtenissen voordat u een abonneeobject verwijdert. Totdat u zich afmeldt voor een gebeurtenis, heeft de multicast-gemachtigde die ten grondslag aan de gebeurtenis in het publicatieobject een verwijzing heeft naar de gemachtigde die de gebeurtenis-handler van de abonnee inkapselt. Zolang het publicatieobject die verwijzing bevat, wordt uw abonneeobject niet verwijderd door garbagecollection.

Afmelden voor een gebeurtenis

  • Gebruik de toewijzingsoperator voor aftrekken (-=) om u af te melden voor een gebeurtenis:

    publisher.RaiseCustomEvent -= HandleCustomEvent;  
    

    Wanneer alle abonnees zich hebben afgemeld voor een gebeurtenis, is het gebeurtenisexemplaren in de uitgeversklasse ingesteld op null.

Zie ook