Procedura per sottoscrivere e annullare la sottoscrizione di eventi (Guida per programmatori C#)
Si sottoscrive un evento pubblicato da un'altra classe quando si vuole scrivere codice personalizzato che viene chiamato quando viene generato tale evento. È ad esempio possibile sottoscrivere l'evento click
di un pulsante perché l'applicazione esegua un'operazione utile quando l'utente fa clic sul pulsante in questione.
Per sottoscrivere gli eventi usando l'IDE di Visual Studio
Se la finestra Proprietà non viene visualizzata, nella visualizzazione Progettazione fare clic con il pulsante destro del mouse sul modulo o sul controllo per cui si vuole creare un gestore eventi e selezionare Proprietà.
Nella parte superiore della finestra Proprietà fare clic sull'icona Eventi.
Fare doppio clic sull'evento che si vuole creare, ad esempio sull'evento
Load
.Visual C# crea un metodo del gestore eventi vuoto e lo aggiunge al codice. In alternativa, è possibile aggiungere manualmente il codice nella visualizzazione Codice. Ad esempio, le righe di codice seguenti dichiarano un metodo del gestore eventi che verrà chiamato quando la classe
Form
genera l'eventoLoad
.private void Form1_Load(object sender, System.EventArgs e) { // Add your form load event handling code here. }
La riga di codice necessaria per sottoscrivere l'evento viene generata automaticamente nel metodo
InitializeComponent
nel file Form1.Designer.cs del progetto. La riga ha un aspetto simile a quanto riportato di seguito:this.Load += new System.EventHandler(this.Form1_Load);
Per sottoscrivere gli eventi a livello di codice
Definire un metodo del gestore eventi la cui firma corrisponda alla firma del delegato per l'evento. Se ad esempio l'evento è basato sul tipo di delegato EventHandler, il codice riportato di seguito rappresenta lo stub del metodo:
void HandleCustomEvent(object sender, CustomEventArgs a) { // Do something useful here. }
Usare l'operatore di assegnazione di addizione (
+=
) per associare un gestore all'evento. Nell'esempio seguente si supponga che a un oggetto denominatopublisher
sia associato un evento denominatoRaiseCustomEvent
. Si noti che per la classe subscriber è necessario un riferimento alla classe publisher per sottoscrivere gli eventi corrispondenti.publisher.RaiseCustomEvent += HandleCustomEvent;
È anche possibile usare un'espressione lambda per specificare un gestore eventi:
public Form1() { InitializeComponent(); this.Click += (s,e) => { MessageBox.Show(((MouseEventArgs)e).Location.ToString()); }; }
Per sottoscrivere gli eventi usando una funzione anonima
Se non è necessario annullare la sottoscrizione a un evento in un secondo momento, è possibile usare l'operatore di assegnazione di addizione (+=
) per allegare una funzione anonima come gestore dell’evento. Nell'esempio seguente si supponga che a un oggetto denominato publisher
sia associato un evento denominato RaiseCustomEvent
e che sia stata definita una classe CustomEventArgs
con informazioni specializzate sull'evento. Si noti che per la classe subscriber è necessario un riferimento alla classe publisher
per sottoscrivere gli eventi corrispondenti.
publisher.RaiseCustomEvent += (object o, CustomEventArgs e) =>
{
string s = o.ToString() + " " + e.ToString();
Console.WriteLine(s);
};
Non si può annullare facilmente la sottoscrizione di un evento se per la sottoscrizione è stata usata una funzione anonima. Per annullare la sottoscrizione in questo scenario, tornare al codice in cui è stato sottoscritto l'evento, archiviare la funzione anonima in una variabile del delegato e quindi aggiungere il delegato all'evento. È consigliabile non usare funzioni anonime per sottoscrivere eventi se si prevede di dover annullare la sottoscrizione all'evento in un punto successivo nel codice. Per altre informazioni sulle funzioni anonime, consultare Espressioni lambda.
Annullamento della sottoscrizione
Per evitare che il gestore eventi venga chiamato al momento della generazione dell'evento, annullare la sottoscrizione all'evento stesso. Per evitare di perdere risorse, è necessario annullare la sottoscrizione agli eventi prima di eliminare un oggetto sottoscrittore. Finché non si annulla la sottoscrizione di un evento, il delegato multicast sottostante all'evento nell'oggetto publisher contiene un riferimento al delegato che incapsula il gestore eventi del sottoscrittore. Finché l'oggetto publisher include tale riferimento, l'oggetto subscriber non verrà eliminato dal processo di Garbage Collection.
Per annullare la sottoscrizione di un evento
Usare l'operatore di assegnazione di sottrazione (
-=
):publisher.RaiseCustomEvent -= HandleCustomEvent;
Quando tutti i sottoscrittori hanno annullato la sottoscrizione a un evento, l'istanza dell'evento nella classe publisher viene impostata su
null
.