Domanda

Qualche anno fa, ho letto un libro che descriveva come si poteva sovrascrivere l'implementazione predefinita di "dispatcher" di eventi in .NET con il proprio processore.

    class foo {
       public event EventHandler myEvent;
       ...
    }

    ...
      myFoo.myEvent += myBar1.EventHandler;
      myFoo.myEvent += myBar2.EventHandler;

Ogni volta che l'evento si attiva, verranno chiamati entrambi i gestori myBar1 e myBar2.

Come ricordo, l'implementazione predefinita di questo ciclo utilizza un elenco collegato e scorre semplicemente sull'elenco e chiama i delegati di EventHandler in ordine.

La mia domanda è duplice:

  1. Qualcuno sa quale libro stavo leggendo?
  2. Perché dovresti voler sovrascrivere l'implementazione di default (a cui si potrebbe rispondere nel libro)?

Modifica: il libro a cui mi riferivo era in effetti il ??CLR di Jeffrey Richter tramite C #

È stato utile?

Soluzione

Potrebbe essere stato uno dei tanti libri o articoli web.

Ci sono vari motivi per cui potresti voler cambiare il modo in cui gli eventi sono iscritti / cancellati:

  • Se hai molti eventi, molti dei quali potrebbero non essere abbonati, potresti voler usare EventHandlerList per ridurre l'utilizzo della memoria
  • Potresti voler registrare abbonamento / annullamento iscrizione
  • Potresti voler usare un riferimento debole per evitare che la vita dell'abbonato sia legata alla tua
  • Potresti voler modificare il blocco associato all'iscrizione / annullamento dell'iscrizione

Sono sicuro che ce ne sono altri - quelli sono fuori di testa :)

MODIFICA: nota inoltre che esiste una differenza tra avere un modo personalizzato di gestire l'abbonamento / disiscrizione e avere un modo personalizzato di generare l'evento (che può chiamare GetInvocationList e garantire che tutti i gestori vengano chiamati, indipendentemente dalle eccezioni, ad esempio) .

Altri suggerimenti

Mi sembra di ricordare qualcosa di simile nel CLR di Jeffrey Richter tramite C #. Modifica: ricordo sicuramente che ne parla in dettaglio.

Esistono diversi motivi per assumere il controllo della registrazione dell'evento. Uno di questi è quello di ridurre il gonfiore del codice quando hai tonnellate di eventi. Penso che Jeffrey abbia approfondito questo argomento nel libro ...

  1. No
  2. Potrebbe essere necessario, ad esempio, interrompere la catena di chiamate in base al risultato di uno dei gestori. Supponi che il tuo oggetto CustomEventArgs abbia una proprietà "Bloccata", che se impostata su true elimina tutte le ulteriori chiamate del gestore eventi.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top