C# Language Déclarer et soulever des événements


Exemple

Déclarer un événement

Vous pouvez déclarer un événement sur une class ou une struct utilisant la syntaxe suivante:

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

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

Il existe une syntaxe étendue pour la déclaration des événements, dans laquelle vous détenez une instance privée de l'événement et définissez une instance publique à l'aide de la fonction add et set accessors. La syntaxe est très similaire aux propriétés C #. Dans tous les cas, la syntaxe illustrée ci-dessus doit être préférée, car le compilateur émet du code pour garantir que plusieurs threads peuvent ajouter et supprimer en toute sécurité des gestionnaires d'événements pour l'événement de votre classe.

Élever l'événement

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);

}

Notez que les événements ne peuvent être déclenchés que par le type déclarant. Les clients ne peuvent s'inscrire / se désinscrire

Pour les versions C # antérieures à 6.0, où EventName?.Invoke n'est pas pris en charge, il est EventName?.Invoke d'attribuer l'événement à une variable temporaire avant l'appel, comme illustré dans l'exemple, qui garantit la sécurité des threads. code. Si vous ne le faites pas, une NullReferenceException peut être NullReferenceException dans certains cas où plusieurs threads utilisent la même instance d'objet. Dans C # 6.0, le compilateur émet un code similaire à celui montré dans l'exemple de code pour C # 6.