Aggiornamento: novembre 2007
Un evento è un messaggio inviato da un oggetto per segnalare il verificarsi di un'azione. L'azione può essere causata da un intervento dell'utente, ad esempio un clic del mouse, o da qualche altra porzione logica del programma. L'oggetto che genera l'evento viene definito mittente. L'oggetto che cattura l'evento e reagisce di conseguenza si dice ricevente.
Nella comunicazione degli eventi la classe mittente dell'evento non sa quale oggetto o metodo riceverà (gestirà) l'evento da essa generato. Occorre individuare un intermediario (un meccanismo analogo a un puntatore) tra il mittente e il ricevente. .NET Framework definisce uno speciale tipo (Delegate) che fornisce le funzionalità di un puntatore a funzione.
Un delegato è una classe che può mantenere un riferimento a un metodo. Diversamente da altre classi, una classe delegata ha una firma e può mantenere riferimenti solo a metodi che corrispondono alla propria firma. Un delegato è pertanto equivalente a un callback o a un puntatore a funzione indipendente dai tipi. Benché i delegati possano essere utilizzati in modi diversi, l'analisi viene qui centrata sulle funzionalità di gestione eventi. La dichiarazione di un delegato è sufficiente a definire una classe delegata. La dichiarazione fornisce la firma del delegato e Common Language Runtime fornisce l'implementazione. Nell'esempio che segue viene illustrata la dichiarazione del delegato di un evento.
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)
La sintassi è simile a quella della dichiarazione di un metodo. La parola chiave delegate informa però il compilatore che il tipo di AlarmEventHandler è delegato. Per convenzione, i delegati di evento di .NET Framework accettano due parametri, l'origine che ha generato l'evento e i dati dell'evento.
È possibile associare un'istanza del delegato AlarmEventHandler a ogni metodo che corrisponde alla relativa firma, come ad esempio il metodo AlarmRang della classe WakeMeUp illustrata nell'esempio che segue.
public class WakeMeUp
{
// AlarmRang has the same signature as AlarmEventHandler.
public void AlarmRang(object sender, AlarmEventArgs e)
{...};
...
}
Public Class WakeMeUp
' AlarmRang has the same signature as AlarmEventHandler.
Public Sub AlarmRang(sender As Object, e As AlarmEventArgs)
...
End Sub
...
End Class
L'uso di delegati di evento personalizzati è richiesto solo quando un evento genera dati. Molti eventi, tra cui alcuni eventi di interfaccia utente quali i clic del mouse, non generano dati. In tali casi, il delegato di evento fornito con la libreria di classi per gli eventi privi di dati, System..::.EventHandler, risulta adeguato. Segue la relativa dichiarazione.
delegate void EventHandler(object sender, EventArgs e);
Public Delegate Sub EventHandler(sender As Object, e As EventArgs)
I delegati di evento sono multicast, il che significa che possono mantenere riferimenti a più metodi di gestione eventi. Per informazioni dettagliate, vedere Delegate. I delegati consentono flessibilità e controllo avanzato nella gestione eventi. Un delegato comunica gli eventi della classe che genera l'evento mantenendo un elenco dei gestori eventi registrati per quell'evento.
Per informazioni dettagliate su come utilizzare i delegati per aggiungere le funzionalità di gestione eventi al proprio componente o controllo, vedere Generazione di un evento.
Per una panoramica di come utilizzare gli eventi nelle proprie applicazioni, vedere Utilizzo degli eventi.

Vedere anche
Attività
Concetti
Altre risorse