C# LanguageEventos


Introducción

Un evento es una notificación de que algo ocurrió (como un clic del mouse) o, en algunos casos, está a punto de ocurrir (como un cambio de precio).

Las clases pueden definir eventos y sus instancias (objetos) pueden provocar estos eventos. Por ejemplo, un botón puede contener un evento de clic que se genera cuando un usuario lo ha hecho clic.

Los controladores de eventos son métodos que se llaman cuando se genera el evento correspondiente. Un formulario puede contener un controlador de eventos de clic para cada botón que contiene, por ejemplo.

Parámetros

Parámetro Detalles
EventArgsT El tipo que se deriva de EventArgs y contiene los parámetros del evento.
Nombre del evento El nombre del evento.
Nombre del controlador El nombre del controlador de eventos.
SenderObject El objeto que invoca el evento.
EventosArgumentos Una instancia del tipo EventArgsT que contiene los parámetros del evento.

Observaciones

Al plantear un evento:

  • Compruebe siempre si el delegado es null . Un delegado nulo significa que el evento no tiene suscriptores. Si se genera un evento sin suscriptores, se obtendrá una NullReferenceException .
6.0
  • Copie el delegado (por ejemplo, EventName ) en una variable local (por ejemplo, eventName ) antes de verificar si el evento es nulo / eventName . Esto evita las condiciones de carrera en entornos de subprocesos múltiples:

Mal

    if(Changed != null)      // Changed has 1 subscriber at this point
                             // In another thread, that one subscriber decided to unsubscribe
        Changed(this, args); // `Changed` is now null, `NullReferenceException` is thrown.

A la derecha

    // Cache the "Changed" event as a local. If it is not null, then use
    // the LOCAL variable (handler) to raise the event, NOT the event itself.
    var handler = Changed;
    if(handler != null)
        handler(this, args);
6.0
  • Use el operador condicional nulo (?.) Para elevar el método en lugar de verificar nulo al delegado en busca de suscriptores en una instrucción if : EventName?.Invoke(SenderObject, new EventArgsT());
  • Cuando se usa Acción <> para declarar tipos de delegados, la firma del controlador de eventos / eventos anónimo debe ser la misma que el tipo de delegado anónimo declarado en la declaración de eventos.

Eventos Ejemplos relacionados