C# Language Dichiarare e sollevare eventi


Esempio

Dichiarazione di un evento

Puoi dichiarare un evento su qualsiasi class o struct usando la seguente sintassi:

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

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

Esiste una sintassi espansa per la dichiarazione degli eventi, in cui si detiene un'istanza privata dell'evento e si definisce un'istanza pubblica utilizzando add e set accessors. La sintassi è molto simile alle proprietà C #. In tutti i casi, la sintassi sopra illustrata dovrebbe essere preferita, poiché il compilatore emette il codice per garantire che più thread possano aggiungere e rimuovere in modo sicuro i gestori di eventi all'evento della classe.

Alzare l'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);

}

Tieni presente che gli eventi possono essere generati solo dal tipo di dichiarazione. I clienti possono solo iscriversi / annullare l'iscrizione.

Per le versioni C # precedenti alla 6.0, dove EventName?.Invoke non è supportato, è buona pratica assegnare l'evento a una variabile temporanea prima del richiamo, come mostrato nell'esempio, che garantisce la sicurezza del thread nei casi in cui più thread eseguono lo stesso codice. In caso NullReferenceException possibile che venga generata una NullReferenceException in alcuni casi in cui più thread utilizzano la stessa istanza di oggetto. In C # 6.0, il compilatore emette un codice simile a quello mostrato nell'esempio di codice per C # 6.