Eventpatronen en valkuilen (geheugenlekken)
Herken en verhelp valkuilen bij events: zeg abonnementen op om geheugenlekken te voorkomen, bewaar delegate-verwijzingen om ze te kunnen verwijderen en gebruik een IDisposable-abonnementspatroon.
Eventpatronen en valkuilen (geheugenlekken) is een gratis C# Academy-les op CoddyKit. Dit is les 3 van 3. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C# Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C# Academy bevat in totaal 3 lessen.
Overzicht van valkuilen
Doel: events veilig gebruiken.
- Zeg je abonnement op om geheugenlekken te voorkomen
- Houd een verwijzing naar dezelfde handler bij om deze te verwijderen
- Geef de voorkeur aan een klein patroon met IDisposable voor opruimen
- Vermijd inline anonieme handlers waarvan je het abonnement niet kunt opzeggen
Abonnement opzeggen om lekken te voorkomen
Events houden verwijzingen naar abonnees vast. Als de publisher lang blijft bestaan en je het abonnement nooit opzegt, kan de abonnee niet worden verzameld.
using System;
public class Publisher
{
public event EventHandler Tick;
public void Fire()
{
EventHandler h = Tick;
if (h != null) h(this, EventArgs.Empty);
}
}
public class Subscriber
{
public void Handle(object s, EventArgs e)
{
Console.WriteLine("Handling tick");
}
public void Subscribe(Publisher p) { p.Tick += Handle; }
public void Unsubscribe(Publisher p) { p.Tick -= Handle; } // required to avoid leaks
}
public class Program
{
public static void Main(string[] args)
{
Publisher p = new Publisher();
Subscriber s = new Subscriber();
s.Subscribe(p);
p.Fire(); // prints once
s.Unsubscribe(p); // detach when done
s = null; // now eligible for GC in a real app
p.Fire(); // no output
}
}
Verwijzing naar de handler bijhouden
Om het abonnement van een anonieme handler op te zeggen, sla je deze op in een variabele en geef je dezelfde instantie door aan -=.
using System;
public class Button
{
public event EventHandler Click;
public void Simulate()
{
EventHandler h = Click;
if (h != null) h(this, EventArgs.Empty);
}
}
public class Program
{
public static void Main(string[] args)
{
Button b = new Button();
// BAD: cannot easily remove this later
// b.Click += (s, e) => Console.WriteLine("inline");
// GOOD: store the handler, attach, later detach the same instance
EventHandler saved = (s, e) => Console.WriteLine("saved");
b.Click += saved;
b.Simulate(); // prints "saved"
b.Click -= saved; // can remove because we kept the reference
b.Simulate(); // no output
}
}
Abonnement met IDisposable
Retourneer een IDisposable vanuit Subscribe. Gebruik using om het abonnement automatisch op te zeggen.
using System;
public class Ticker
{
public event EventHandler Tick;
public IDisposable Subscribe(EventHandler handler)
{
Tick += handler;
return new Unsubscriber(this, handler);
}
private sealed class Unsubscriber : IDisposable
{
private Ticker _t;
private EventHandler _h;
private bool _done;
public Unsubscriber(Ticker t, EventHandler h) { _t = t; _h = h; }
public void Dispose()
{
if (!_done)
{
_t.Tick -= _h;
_done = true;
}
}
}
public void Fire()
{
EventHandler h = Tick;
if (h != null) h(this, EventArgs.Empty);
}
}
public class Program
{
public static void Main(string[] args)
{
Ticker t = new Ticker();
using (t.Subscribe((s, e) => Console.WriteLine("tick")))
{
t.Fire(); // prints once
}
t.Fire(); // nothing after disposal
}
}
Loskoppelen met try/finally
Gebruik try/finally wanneer een handler ook moet worden losgekoppeld als er een uitzondering wordt gegenereerd.
using System;
public class Alarm
{
public event EventHandler Ring;
public void Trigger()
{
EventHandler h = Ring;
if (h != null) h(this, EventArgs.Empty);
}
}
public class Program
{
public static void Main(string[] args)
{
Alarm a = new Alarm();
EventHandler h = (s, e) => Console.WriteLine("ring");
a.Ring += h;
try
{
a.Trigger(); // do work with subscription active
}
finally
{
a.Ring -= h; // always detach
}
a.Trigger(); // no output
}
}
Tips om lekken te voorkomen
Tips:
- Abonnees moeten zelf verantwoordelijk zijn voor het opzeggen van hun abonnement (Dispose, finally of een expliciete methode).
- Vermijd abonnementen met inline anonieme handlers die je niet kunt verwijderen.
- Wees voorzichtig met statische events; deze blijven vaak langer bestaan dan objecten.
- Houd handlers kort en blokkeer de publisher niet.
Oorzaak van lekken bij events
Samenvatting
Samenvatting: zeg je abonnement op om lekken te voorkomen, bewaar verwijzingen naar handlers om ze te kunnen verwijderen en geef de voorkeur aan patronen met Dispose of finally voor een veilige levensduur van events.
Leer C# met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 93
- Lessen
- 346
Veelgestelde vragen
Is de les “Eventpatronen en valkuilen (geheugenlekken)” gratis?
Ja — de volledige tekst van “Eventpatronen en valkuilen (geheugenlekken)” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus C# Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus C# Academy bevat in totaal 3 lessen.
Wat leer ik in “Eventpatronen en valkuilen (geheugenlekken)”?
Herken en verhelp valkuilen bij events: zeg abonnementen op om geheugenlekken te voorkomen, bewaar delegate-verwijzingen om ze te kunnen verwijderen en gebruik een IDisposable-abonnementspatroon. Je oefent met C# Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met C# Academy te beginnen?
Ervaring vooraf is niet nodig. C# Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 3.
Hoe lang duurt de les “Eventpatronen en valkuilen (geheugenlekken)”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over C# Academy?
Ja. Elke les over C# Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- delegate, Action/Func, closures
- Gebeurtenissen: publiceren/abonneren, het trefwoord event
- Eventpatronen en valkuilen (geheugenlekken)