C# Language Declarar y levantar eventos


Ejemplo

Declarar un evento

Puedes declarar un evento en cualquier class o struct usando la siguiente sintaxis:

public class MyClass
{
    // Declares the event for MyClass
    public event EventHandler MyEvent;

    // Raises the MyEvent event
    public void RaiseEvent()
    {
        OnMyEvent();
    }
}    

Hay una sintaxis expandida para declarar eventos, donde se tiene una instancia privada del evento, y se define una instancia pública utilizando los accesores de add y set . La sintaxis es muy similar a las propiedades de C #. En todos los casos, se debe preferir la sintaxis demostrada anteriormente, ya que el compilador emite código para ayudar a garantizar que varios subprocesos puedan agregar y eliminar de forma segura los controladores de eventos al evento en su clase.

Elevando el evento

6.0
private void OnMyEvent()
{
    EventName?.Invoke(this, EventArgs.Empty); 
}
6.0
private void OnMyEvent()
{
    // Use a local for EventName, because another thread can modify the
    // public EventName between when we check it for null, and when we
    // raise the event.
    var eventName = EventName;

    // If eventName == null, then it means there are no event-subscribers,
    // and therefore, we cannot raise the event.
    if(eventName != null)
        eventName(this, EventArgs.Empty);

}

Tenga en cuenta que los eventos solo pueden ser provocados por el tipo declarante. Los clientes solo pueden suscribirse / darse de baja.

Para versiones de C # anteriores a 6.0, donde EventName?.Invoke no es compatible, es una buena práctica asignar el evento a una variable temporal antes de la invocación, como se muestra en el ejemplo, que garantiza la seguridad de subprocesos en los casos en que varios subprocesos ejecutan el mismo código. Si no lo hace, puede provocar una NullReferenceException en ciertos casos en los que varios subprocesos utilizan la misma instancia de objeto. En C # 6.0, el compilador emite un código similar al que se muestra en el ejemplo de código para C # 6.