Eventi e delegati
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 Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
public delegate void AlarmEventHandler(Object^ sender, AlarmEventArgs^ e);
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 Sub AlarmRang(sender As Object, e As AlarmEventArgs)
'...
End Sub
'...
End Class
public class WakeMeUp
{
// AlarmRang has the same signature as AlarmEventHandler.
public void AlarmRang(object sender, AlarmEventArgs e)
{
//...
}
//...
}
public ref class WakeMeUp
{
public:
// AlarmRang has the same signature as AlarmEventHandler.
void AlarmRang(Object^ sender, AlarmEventArgs^ e)
{
//...
}
//...
};
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 Sub EventHandler(sender As Object, e As EventArgs)
delegate void EventHandler(object sender, EventArgs e);
delegate void EventtHandler(Object^ sender, EventArgs^ e);
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à
Procedura: generare e utilizzare eventi
Procedura: connettere agli eventi metodi per la gestione degli eventi