Question

Il y a quelques années, j'ai lu un livre décrivant comment remplacer l'implémentation d'événement par défaut "Répartiteur" dans .NET avec votre propre processeur.

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

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

Chaque fois que l'événement est déclenché, les gestionnaires myBar1 et myBar2 sont appelés.

Si je me souviens bien, l'implémentation par défaut de cette boucle utilise une liste chaînée. Elle effectue une itération sur la liste et appelle les délégués EventHandler dans l'ordre.

Ma question est double:

  1. Quelqu'un sait-il quel livre je lisais?
  2. Pourquoi voudriez-vous remplacer l’implémentation par défaut (à laquelle le livre pourrait donner une réponse)?

Modifier: le livre auquel je faisais allusion était bien le CLR de Jeffrey Richter via C #

Était-ce utile?

La solution

Cela aurait pu être l’un des nombreux livres ou articles Web.

Il existe différentes raisons pour lesquelles vous souhaitez modifier le mode d'inscription / désabonnement des événements:

  • Si vous avez plusieurs événements, dont beaucoup risquent de ne pas être abonnés, vous pouvez utiliser EventHandlerList pour réduire votre utilisation de la mémoire
  • Vous pouvez souhaiter enregistrer votre abonnement / désabonnement
  • Vous pouvez utiliser une référence faible pour éviter que la vie de l'abonné ne soit liée à la vôtre
  • Vous pouvez modifier le verrouillage associé à un abonnement / désabonnement

Je suis sûr qu’il y en a plus - ce sont des choses qui me sortent de la tête:)

EDIT: notez également qu’il existe une différence entre une méthode personnalisée de gestion des abonnements / désabonnements et une méthode personnalisée pour déclencher l’événement (qui peut appeler GetInvocationList et garantir que tous les gestionnaires sont appelés, indépendamment des exceptions, par exemple). .

Autres conseils

Il semble que je me souvienne de quelque chose de similaire dans le CLR de Jeffrey Richter via C #. Modifier : je me souviens vraiment qu'il en parle plus en détail.

Il existe différentes raisons pour prendre le contrôle de l'enregistrement d'un événement. L'un d'eux consiste à réduire le fardeau de code lorsque vous avez une tonne d'événements. Je pense que Jeffrey est entré dans les détails dans le livre ...

  1. Non
  2. Par exemple, vous pourriez avoir besoin de rompre la chaîne d'appels en fonction du résultat de l'un des gestionnaires. Supposons que votre objet CustomEventArgs ait une propriété 'Blocked' qui, lorsqu'elle est définie sur true, supprime toutes les invocations de gestionnaires d’événements.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top