Il modello degli eventi in Visual Basic consente di reagire alle azioni degli utenti attraverso gestori degli eventi che sono collegati ai controlli. Questo è cruciale per le applicazioni con GUI (interfaccia grafica), dove ogni elemento può generare i propri eventi.
Nel classico VB6, la gestione degli eventi era implementata con legame statico controllo — metodo. In VB.NET e WinForms il modello è diventato più flessibile: ora è possibile collegare più gestori a un singolo evento, supporta il collegamento dinamico tramite AddHandler/RemoveHandler.
Una difficoltà tipica è l'aggiunta dinamica di controlli e la gestione dei loro eventi. Se non ci si disiscrive dagli eventi o si collega erroneamente un gestore, possono verificarsi perdite di memoria, chiamate duplicate, perdita di controllo sul comportamento dell'UI.
Quando create controlli dinamicamente, utilizzate AddHandler per iscrivere e RemoveHandler per rimuovere correttamente un gestore. Fate attenzione alla vita dei controlli: se un controllo viene distrutto, è necessario disiscrivere i gestori, altrimenti rimarranno riferimenti "pendenti".
Esempio di codice:
Dim btn As New Button() AddHandler btn.Click, AddressOf ButtonClickHandler ' ... RemoveHandler btn.Click, AddressOf ButtonClickHandler Sub ButtonClickHandler(sender As Object, e As EventArgs) MessageBox.Show("Pulsante premuto!") End Sub
Caratteristiche chiave:
Cosa succede se un gestore di eventi viene collegato più volte allo stesso elemento?
Il gestore verrà chiamato tante volte quante sono state aggiunte tramite AddHandler, il che può portare a esecuzioni inaspettate della logica.
AddHandler btn.Click, AddressOf Handler AddHandler btn.Click, AddressOf Handler ' Quando si preme il pulsante, Handler verrà chiamato 2 volte
È possibile utilizzare un metodo con parametri differenti dalla firma dell'evento?
No, la firma del metodo gestore deve corrispondere esattamente al delegato dell'evento (ad esempio, Sub Handler(sender As Object, e As EventArgs)). Il compilatore genererà un errore in caso contrario.
RemoveHandler rimuove tutte le occorrenze di un gestore se è stato aggiunto più volte?
No, RemoveHandler rimuove solo una registrazione per chiamata. Se un gestore è stato aggiunto più volte, deve essere rimosso lo stesso numero di volte, altrimenti un'istanza rimarrà vincolata.
RemoveHandler durante la distruzione dei controlli, causando perdite di memoriaVengono creati dinamicamente 100 pulsanti in un ciclo, e a tutti viene assegnato un gestore, ma RemoveHandler non viene chiamato. Dopo la chiusura del modulo, l'evento continua a "vivere", portando a frequenti crash.
Pro:
Contro:
A ciascun controllo dinamico nella collezione è stato aggiunto un gestore, etichettato, e alla rimozione del controllo vengono disiscritti esplicitamente tutti i gestori.
Pro:
Contro: