Procedura: sottoscrivere e annullare la sottoscrizione di eventi (Guida per programmatori C#)How to: Subscribe to and Unsubscribe from Events (C# Programming Guide)

Si sottoscrive un evento pubblicato da un'altra classe quando si vuole scrivere codice personalizzato che viene chiamato quando viene generato tale evento.You subscribe to an event that is published by another class when you want to write custom code that is called when that event is raised. È 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.For example, you might subscribe to a button's click event in order to make your application do something useful when the user clicks the button.

Per sottoscrivere gli eventi usando l'IDE di Visual StudioTo subscribe to events by using the Visual Studio IDE

  1. 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à.If you cannot see the Properties window, in Design view, right-click the form or control for which you want to create an event handler, and select Properties.

  2. Nella parte superiore della finestra Proprietà fare clic sull'icona Eventi.On top of the Properties window, click the Events icon.

  3. Fare doppio clic sull'evento che si vuole creare, ad esempio sull'evento Load.Double-click the event that you want to create, for example the Load event.

    Visual C# crea un metodo del gestore eventi vuoto e lo aggiunge al codice.Visual C# creates an empty event handler method and adds it to your code. In alternativa, è possibile aggiungere manualmente il codice nella visualizzazione Codice.Alternatively you can add the code manually in Code view. Ad esempio, le righe di codice seguenti dichiarano un metodo del gestore eventi che verrà chiamato quando la classe Form genera l'evento Load.For example, the following lines of code declare an event handler method that will be called when the Form class raises the Load event.

    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.The line of code that is required to subscribe to the event is also automatically generated in the InitializeComponent method in the Form1.Designer.cs file in your project. La riga ha un aspetto simile a quanto riportato di seguito:It resembles this:

    this.Load += new System.EventHandler(this.Form1_Load);  
    

Per sottoscrivere gli eventi a livello di codiceTo subscribe to events programmatically

  1. Definire un metodo del gestore eventi la cui firma corrisponda alla firma del delegato per l'evento.Define an event handler method whose signature matches the delegate signature for the event. Se ad esempio l'evento è basato sul tipo di delegato EventHandler, il codice riportato di seguito rappresenta lo stub del metodo:For example, if the event is based on the EventHandler delegate type, the following code represents the method stub:

    void HandleCustomEvent(object sender, CustomEventArgs a)  
    {  
       // Do something useful here.  
    }  
    
  2. Usare l'operatore di assegnazione di addizione (+=) per associare il gestore eventi all'evento.Use the addition assignment operator (+=) to attach your event handler to the event. Nell'esempio seguente si supponga che a un oggetto denominato publisher sia associato un evento denominato RaiseCustomEvent.In the following example, assume that an object named publisher has an event named RaiseCustomEvent. Si noti che per la classe subscriber è necessario un riferimento alla classe publisher per sottoscrivere gli eventi corrispondenti.Note that the subscriber class needs a reference to the publisher class in order to subscribe to its events.

    publisher.RaiseCustomEvent += HandleCustomEvent;  
    

    Si noti che la sintassi precedente è nuova in C# 2.0.Note that the previous syntax is new in C# 2.0. Equivale esattamente alla sintassi di C# 1.0, in cui è necessario creare in modo esplicito il delegato incapsulante tramite la parola chiave new:It is exactly equivalent to the C# 1.0 syntax in which the encapsulating delegate must be explicitly created by using the new keyword:

    publisher.RaiseCustomEvent += new CustomEventHandler(HandleCustomEvent);  
    

    È possibile aggiungere un gestore eventi anche tramite un'espressione lambda:An event handler can also be added by using a lambda expression:

    public Form1()  
    {  
        InitializeComponent();  
        // Use a lambda expression to define an event handler.  
        this.Click += (s,e) => { MessageBox.Show(  
           ((MouseEventArgs)e).Location.ToString());};  
    }  
    

    Per altre informazioni, vedere Procedura: Usare espressioni lambda al di fuori di LINQ (Guida per programmatori C#).For more information, see How to: Use Lambda Expressions Outside LINQ.

Per sottoscrivere gli eventi usando un metodo anonimoTo subscribe to events by using an anonymous method

  • Se non è necessario annullare la sottoscrizione di un evento in un secondo momento, è possibile usare l'operatore di assegnazione di addizione (+=) per associare un metodo anonimo all'evento.If you will not have to unsubscribe to an event later, you can use the addition assignment operator (+=) to attach an anonymous method to the event. 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.In the following example, assume that an object named publisher has an event named RaiseCustomEvent and that a CustomEventArgs class has also been defined to carry some kind of specialized event information. Si noti che per la classe subscriber è necessario un riferimento alla classe publisher per sottoscrivere gli eventi corrispondenti.Note that the subscriber class needs a reference to publisher in order to subscribe to its events.

    publisher.RaiseCustomEvent += delegate(object o, CustomEventArgs e)  
    {  
      string s = o.ToString() + " " + e.ToString();  
      Console.WriteLine(s);  
    };  
    

    È importante notare che non si può annullare facilmente la sottoscrizione di un evento se per la sottoscrizione è stata usata una funzione anonima.It is important to notice that you cannot easily unsubscribe from an event if you used an anonymous function to subscribe to it. Per annullare la sottoscrizione in questo scenario, è necessario tornare al codice in cui è stato sottoscritto l'evento, archiviare il metodo anonimo in una variabile del delegato e quindi aggiungere il delegato all'evento.To unsubscribe in this scenario, it is necessary to go back to the code where you subscribe to the event, store the anonymous method in a delegate variable, and then add the delegate to the event. In generale è consigliabile non usare funzioni anonime per sottoscrivere eventi se si prevede di dover annullare la sottoscrizione all'evento in un punto successivo nel codice.In general, we recommend that you do not use anonymous functions to subscribe to events if you will have to unsubscribe from the event at some later point in your code. Per altre informazioni sulle funzioni anonime, vedere Funzioni anonime.For more information about anonymous functions, see Anonymous Functions.

Annullamento della sottoscrizioneUnsubscribing

Per evitare che il gestore eventi venga chiamato al momento della generazione dell'evento, annullare la sottoscrizione all'evento stesso.To prevent your event handler from being invoked when the event is raised, unsubscribe from the event. Per evitare di perdere risorse, è necessario annullare la sottoscrizione agli eventi prima di eliminare un oggetto sottoscrittore.In order to prevent resource leaks, you should unsubscribe from events before you dispose of a subscriber object. 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.Until you unsubscribe from an event, the multicast delegate that underlies the event in the publishing object has a reference to the delegate that encapsulates the subscriber's event handler. Finché l'oggetto publisher include tale riferimento, l'oggetto subscriber non verrà eliminato dal processo di Garbage Collection.As long as the publishing object holds that reference, garbage collection will not delete your subscriber object.

Per annullare la sottoscrizione di un eventoTo unsubscribe from an event

  • Usare l'operatore di assegnazione di sottrazione (-=):Use the subtraction assignment operator (-=) to unsubscribe from an event:

    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.When all subscribers have unsubscribed from an event, the event instance in the publisher class is set to null.

Vedere ancheSee Also