Procedimiento Suscribir y cancelar la suscripción a eventos (Guía de programación de C#)

La suscripción a un evento publicado por otra clase se realiza cuando quiere escribir código personalizado al que se llama cuando se produce ese evento. Por ejemplo, puede suscribirse al evento click de un botón para que la aplicación realice alguna operación cuando el usuario haga clic en el botón.

Para suscribirse a eventos mediante el IDE de Visual Studio

  1. Si no puede ver la ventana Propiedades, en la vista Diseño haga clic con el botón derecho en el formulario o control para el que quiere crear un controlador de eventos y seleccione Propiedades.

  2. En la parte superior de la ventana Propiedades, haga clic en el icono Eventos.

  3. Haga doble clic en el evento que quiera crear, por ejemplo, el evento Load.

    Visual C# crea un método de controlador de eventos vacío y lo agrega al código. También puede agregar manualmente el código en la vista Código. Por ejemplo, las líneas siguientes de código declaran un método de controlador de eventos al que se llamará cuando la clase Form genere el evento Load.

    private void Form1_Load(object sender, System.EventArgs e)
    {
        // Add your form load event handling code here.
    }
    

    La línea de código que es necesaria para suscribirse al evento también se genera automáticamente con el método InitializeComponent en el archivo Form1.Designer.cs del proyecto. Se parece a lo siguiente:

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

Para suscribirse a eventos mediante programación

  1. Defina un método de controlador de eventos cuya firma coincida con la firma de delegado del evento. Por ejemplo, si el evento se basa en el tipo de delegado EventHandler, el siguiente código representa el código auxiliar del método:

    void HandleCustomEvent(object sender, CustomEventArgs a)  
    {  
       // Do something useful here.  
    }  
    
  2. Use el operador de suma y asignación (+=) para asociar el controlador de eventos al evento. En el ejemplo siguiente, se asume que un objeto denominado publisher tiene un evento denominado RaiseCustomEvent. Observe que la clase de suscriptor necesita una referencia a la clase de editor para suscribirse a sus eventos.

    publisher.RaiseCustomEvent += HandleCustomEvent;  
    

    También puede usar una expresión lambda para especificar un controlador de eventos:

    public Form1()  
    {  
        InitializeComponent();  
        this.Click += (s,e) =>
            {
                MessageBox.Show(((MouseEventArgs)e).Location.ToString());
            };
    }  
    

Para suscribirse a eventos mediante una función anónima

Si no tiene que cancelar la suscripción a un evento más adelante, puede usar el operador de asignación y suma (+=) para asociar una función anónima como controlador de eventos. En el ejemplo siguiente, se presupone que un objeto denominado publisher tiene un evento denominado RaiseCustomEvent y que se ha definido una clase CustomEventArgs para proporcionar algún tipo de información específica del evento. Observe que la clase de suscriptor necesita una referencia a publisher para suscribirse a sus eventos.

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

No podrá cancelar la suscripción a un evento fácilmente si ha usado una función anónima para suscribirse a él. Para cancelar la suscripción en este escenario, regrese al código donde se ha suscrito al evento, almacene la función anónima en una variable de delegado y, después, agregue el delegado al evento. Se recomienda que no use funciones anónimas para suscribirse a eventos si tiene que cancelar la suscripción al evento en el código más adelante. Para obtener más información sobre las funciones anónimas, consulte Expresiones lambda.

Cancelar una suscripción

Para impedir que se invoque el controlador de eventos cuando se produce el evento, puede cancelar la suscripción al evento. Para evitar que se pierdan recursos, debe cancelar la suscripción a los eventos antes de eliminar un objeto suscriptor. Hasta que se cancela la suscripción a un evento, el delegado multidifusión subyacente al evento en el objeto de publicación tiene una referencia al delegado que encapsula el controlador de eventos del suscriptor. Mientras el objeto de publicación mantenga esa referencia, la recolección de elementos no utilizados no eliminará el objeto suscriptor.

Para cancelar la suscripción a un evento

  • Use el operador de resta y asignación (-=) para cancelar la suscripción a un evento:

    publisher.RaiseCustomEvent -= HandleCustomEvent;  
    

    Cuando se haya cancelado la suscripción a un evento de todos los suscriptores, la instancia del evento en la clase de editor se establecerá en null.

Vea también