In Visual Basic .NET i delegati (Delegate) sono oggetti che incapsulano un riferimento a un metodo, mentre gli eventi (Events) sono meccanismi di notifica per i sottoscrittori su determinate condizioni o cambiamenti. I delegati consentono di "trasmettere" comportamenti (metodi) come parametri, mentre gli eventi implementano il modello publisher-subscriber.
Caratteristiche:
Event all'interno della classe.AddHandler e la disiscrizione tramite RemoveHandler.Esempio:
' Definizione del delegato Public Delegate Sub NotifyHandler(ByVal message As String) ' Classe con evento Public Class Notifier Public Event OnNotify As NotifyHandler Public Sub DoWork() RaiseEvent OnNotify("Lavoro completato!") End Sub End Class ' Iscrizione e chiamata Dim n As New Notifier() AddHandler n.OnNotify, AddressOf SubNotify Sub SubNotify(ByVal msg As String) Console.WriteLine(msg) End Sub n.DoWork()
Gli eventi sono particolarmente utili nella programmazione UI e nella gestione della logica di business.
Cosa succede se chiami un evento RaiseEvent e non ci sono sottoscrittori?
Risposta errata: Ci sarà un errore di runtime.
Risposta corretta: Non succede nulla — se non ci sono sottoscrittori per l'evento, la chiamata RaiseEvent è sicura e non genererà eccezioni.
Esempio:
Public Event OnUpdate() ' Chiamata RaiseEvent anche se nessuno è iscritto: RaiseEvent OnUpdate() ' È consentito e non genera errori
Storia
In una grande applicazione desktop, il programmatore non si è disiscritto dai gestori degli eventi, causando la mancata liberazione degli oggetti da parte del garbage collector (memory leak). Questo ha portato a un aumento della memoria e a crash dopo alcune ore di funzionamento.
Storia
Un giovane professionista, non comprendendo il funzionamento dei delegati e degli eventi, ha accidentalmente iscritto lo stesso metodo più volte. Ciò ha portato a chiamate multiple degli stessi gestori — gli utenti ricevevano notifiche duplicate.
Storia
In un progetto è stato chiamato l'eventoRaiseEvent, presumendo che avrebbe necessariamente avuto effetto. Nei test è emerso che senza sottoscrittori non c'era alcun effetto, portando a fraintendimenti nella logica di business dell'applicazione e errori nella reportistica.