In Visual Basic .NET zijn delegates (Delegate) objecten die een verwijzing naar een methode encapsuleren, terwijl events (Events) een mechanisme zijn om abonnees te informeren over het optreden van bepaalde voorwaarden of wijzigingen. Delegates stellen je in staat om "gedrag" (methoden) als parameters door te geven, en events implementeren het uitgever-abonnee patroon.
Kenmerken:
Event binnen een klasse.AddHandler en afmelden via RemoveHandler.Voorbeeld:
' Definitie van delegate Public Delegate Sub NotifyHandler(ByVal message As String) ' Klasse met een event Public Class Notifier Public Event OnNotify As NotifyHandler Public Sub DoWork() RaiseEvent OnNotify("Werk voltooid!") End Sub End Class ' Abonneren en aanroepen Dim n As New Notifier() AddHandler n.OnNotify, AddressOf SubNotify Sub SubNotify(ByVal msg As String) Console.WriteLine(msg) End Sub n.DoWork()
Events zijn vooral nuttig in UI-programmering en de dispatching van bedrijfslogica.
Wat gebeurt er als je een event RaiseEvent aanroept en er zijn geen abonnees?
Onjuist antwoord: Er treedt een runtime-fout op.
Juist antwoord: Er gebeurt niets — als er geen abonnees zijn voor het event, is de aanroep van RaiseEvent veilig en zal er geen uitzondering zijn.
Voorbeeld:
Public Event OnUpdate() ' Aanroep van RaiseEvent, zelfs als er niemand is geabonneerd: RaiseEvent OnUpdate() ' Toegestaan en leidt niet tot een fout
Verhaal
In een grote desktopapplicatie heeft een ontwikkelaar de handlers niet afgemeld van events, waardoor objecten niet werden vrijgegeven door de garbage collector (geheugenlek). Dit leidde tot een groei van het geheugen en crashes na enkele uren gebruik.
Verhaal
Een jonge professional, die de werking van delegates en events niet begreep, heeft per ongeluk dezelfde methode meerdere keren achtereen geabonneerd. Dit leidde tot meervoudige aanroepen van dezelfde handlers — gebruikers ontvingen duplicaten van meldingen.
Verhaal
In één project werd het eventRaiseEventaangeroepen, in de veronderstelling dat het altijd effect zou hebben. Tijdens de tests werd ontdekt dat zonder abonnees er geen effect was, wat leidde tot misverstanden in de bedrijfslogica van de applicatie en foutieve rapportages.