ProgrammazioneSviluppatore VB.NET

Descrivi il funzionamento e le caratteristiche della gestione degli eventi (Events) e dei delegati (Delegates) in Visual Basic .NET. Quali problemi possono sorgere con un uso improprio?

Supera i colloqui con l'assistente IA Hintsage

Risposta

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:

  • Gli eventi sono dichiarati utilizzando la parola chiave Event all'interno della classe.
  • I delegati definiscono la firma dei metodi a cui è possibile iscriversi all'evento.
  • L'iscrizione avviene tramite 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.

Domanda insidiosa

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

Esempi di errori reali a causa della scarsa conoscenza dell'argomento


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'evento RaiseEvent, 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.