C# Languageeventi


introduzione

Un evento è una notifica che qualcosa si è verificato (come un clic del mouse) o, in alcuni casi, sta per verificarsi (come una variazione di prezzo).

Le classi possono definire eventi e le loro istanze (oggetti) possono generare questi eventi. Ad esempio, un pulsante può contenere un evento Click che viene generato quando un utente ha fatto clic su di esso.

I gestori di eventi sono quindi i metodi che vengono richiamati quando viene generato l'evento corrispondente. Un modulo può contenere un gestore di eventi Clicked per ogni pulsante che contiene, per esempio.

Parametri

Parametro Dettagli
EventArgsT Il tipo che deriva da EventArgs e contiene i parametri dell'evento.
Nome dell'evento Il nome dell'evento.
handlerName Il nome del gestore di eventi.
SenderObject L'oggetto che sta invocando l'evento.
EventArguments Un'istanza del tipo EventArgsT che contiene i parametri dell'evento.

Osservazioni

Quando si alza un evento:

  • Controllare sempre se il delegato è null . Un delegato nullo significa che l'evento non ha sottoscrittori. Aumentare un evento senza abbonati comporterà una NullReferenceException .
6.0
  • Copia il delegato (ad es. EventName ) in una variabile locale (ad es. eventName ) prima di verificare la presenza di null / raise dell'evento. Questo evita condizioni di gara in ambienti multi-thread:

Sbagliato :

    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 destra :

    // 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
  • Utilizzare l'operatore null-condizionale (?.) Per aumentare il metodo anziché il controllo null del delegato per i sottoscrittori in un'istruzione if : EventName?.Invoke(SenderObject, new EventArgsT());
  • Quando si utilizza l'azione <> per dichiarare i tipi di delegato, la firma del gestore di un metodo / evento anonimo deve essere uguale al tipo di delegato anonimo dichiarato nella dichiarazione di evento.

eventi Esempi correlati