Sia che parliamo di programmazione per Windows Form o Web Form la gestione degli eventi in C# è un'aspetto fondamentale che ogni buon programmatore deve conoscere.
Il meccanismo degli eventi consente di notificare dei messaggi tra gli oggetti della mia applicazione al verificarsi di determinate condizioni. Allo scatenarsi di un evento è possibile gestirlo opportunamente per effettuare operazioni ed intraprendere azioni per variare il comportamento dell'applicazione come reazione al cambiamento del suo stato.
Un oggetto che genera un'evento, lo notifica ad un'altro che lo prende in carico e lo gestisce (handler dell'evento), tale meccanismo viene implementato per mezzo dei delegates, gli eventi in C# non sono altro che particolari tipi di delegate multicast.
Gli eventi allora completano le nostre classi, corredandole oltre che di metodi e proprietà, anche di un meccanismo per la notifica di messaggi agli altri oggetti, con la possibilità anche di gestirli con azioni (gestore dell'evento, handler) che interessano il cambiamento di stato. La classe base del .NET framework dal quale far derivare la definizione delle nostre classi per gli eventi è System.EventArgs, e specificare il delegate che ne rappresenta la firma per il gestore dell'evento (handler). Per i delegate, il tipo base per il gestore degli eventi è System.EventHandler, quest'ultimo accetta due parametri in ingresso, uno di tipo Sender che non è altro che l'oggetto che ha scatenato l'evento, e l'altro di tipo EventArgs ossia l'evento stesso contenente tutte le informazioni su di esso. Mentre per definire un evento come membro di una classe è necessario farlo tramite la parola chiave event. Come vedete la relazione tra eventi e delegati è strettissima.
Gli eventi sono molto usati nella programmazione Windows, Windows stesso si basa su un meccanismo ad eventi, inoltre sia in applicazioni desktop (le Win Form) che in quelle Web (Web Form) lo scatenarsi di un evento è spesso legato all'interazione dell'utente con l'applicazione, il più banale degli esempi è quello della pressione di un bottone che genera l'evento click.
Ogni evento definito all'interno di una classe, possiede uno o più handler (event multicast) per eseguire l'azione necessaria (consumare l'evento) al suo verificarsi, Per sottoscrivere un handler ad un evento si fà uso dell'operatore +=, l'operazione inversa invece di desottoscrizione avviene con l'operatore -=.
Supponiamo di avere un Button con "ID=ButtonSend" per l'invio delle informarzioni di un form, tramite l'IDE di Visual Studio o tramite la colonna Properties del button è facile creare il gestore del corrispondente evento click, ma se volessimo fare tutto a manina dovremmo più o meno scrivere così:
//sottoscrivo l'evento all'Handler generico
ButtonSend.Click += new EventHandler(OnButtonSend_Click);
//gestore dell'evento
protected void OnButtonSend_Click(object sender, EventArgs e)
{
//do something ...
}
Come notate il gestore dell'evento, per convenzione preceduto da "On", accetta i due parametri Sender ed EventArgs che riconrdiamo sono l'oggetto che ha scatenato l'evento e l'oggetto contenente le informazioni sull'evento (che può essere anche una classe derivante da EventArgs da noi appositamente definita).
Gli eventi in C# non vengono usati soltanto per notificare un semplice click di un bottone, ma in moltissimi altri e più complessi casi, come per la realizzazione di servizi windows ed applicazioni multitrhead, la loro importanza è quindi davvero notevole in qualsiasi ramo della programmazione noi vogliamo lanciarci, conoscerli ed assimilarli è pertanto fondamentale per ogni buon sviluppatore.