ProgrammazioneSviluppatore VB.NET

Descrivi la meccanica degli eventi (Events) in Visual Basic e fornisci un esempio di creazione di un evento personalizzato. A cosa prestare attenzione durante la dichiarazione e l'iscrizione?

Supera i colloqui con l'assistente IA Hintsage

Risposta

In Visual Basic, gli eventi (Events) consentono a un oggetto di notificare ad altri componenti dell'applicazione che si sono verificati cambiamenti. Un evento viene dichiarato tramite la parola chiave Event. Viene invocato utilizzando il metodo RaiseEvent (VB.NET) o Raise (VB6), e i componenti possono iscriversi ad esso (Handles/WithEvents).

Esempio VB.NET:

Public Class Worker Public Event WorkCompleted As EventHandler Public Sub DoWork() ' ...qualche lavoro RaiseEvent WorkCompleted(Me, EventArgs.Empty) End Sub End Class Public Class Manager Private WithEvents w As Worker Public Sub New() w = New Worker() End Sub Private Sub w_WorkCompleted(sender As Object, e As EventArgs) Handles w.WorkCompleted Console.WriteLine("Lavoro completato!") End Sub End Class

Punti importanti:

  • Un evento può essere sollevato solo nella stessa classe in cui è stato dichiarato.
  • Se l'evento ha argomenti, i loro tipi devono essere rigorosamente definiti.
  • WithEvents può essere usato solo con campi e proprietà di classe.
  • Dopo esserti iscritto a un evento, non dimenticare di disiscriverti quando necessario (ad esempio, per evitare perdite di memoria).

Domanda ingannevole

È possibile dichiarare un evento con un modificatore di accesso Private e iscriversi ad esso da un'altra classe?

Risposta: No, il modificatore Private limita la visibilità dell'evento solo a quella classe in cui è stato dichiarato. Altre classi non lo vedranno e quindi non potranno iscriversi.

Esempi di errori reali a causa della mancanza di conoscenza delle sottigliezze dell'argomento


Storia

In una grande applicazione, gli eventi venivano creati con il modificatore Public, ma non venivano mai esplicitamente disiscritti. Durante un lungo utilizzo dell'applicazione, ciò portava a perdite di memoria in quanto i gestori si riferivano a oggetti non necessari.


Storia

Durante la migrazione da VB6 a VB.NET, lo sviluppatore si aspettava che l'evento fosse disponibile in tutti i moduli, ma per impostazione predefinita l'evento era Friend. Di conseguenza, il gestore non veniva attivato, e questo bug è stato trovato solo nei test di integrazione.


Storia

Un programmatore ha commesso un errore nella firma del delegato dell'evento, scambiando sender e e. Non c'era alcun messaggio di errore (il gestore dell'evento non veniva semplicemente chiamato), e la logica di business necessaria veniva silenziosamente saltata fino al rilascio pre-final.