Prenez la classe C # suivante:
c1 {
event EventHandler someEvent;
}
S'il y a beaucoup d'abonnements à c1
l' someEvent
événement de s et que je souhaite tous les effacer, quelle est la meilleure façon d'y parvenir? Considérez également que les abonnements à cet événement peuvent être / sont des lambdas / des délégués anonymes.
Actuellement, ma solution consiste à ajouter une ResetSubscriptions()
méthode à c1
celle définie someEvent
sur null. Je ne sais pas si cela a des conséquences invisibles.
EventHandlerList
, vous pourrez peut-être le faire. Vous devrez cependant reconnaître ces deux cas - et il pourrait y avoir un certain nombre d'autres implémentations.hidden
.Ajoutez une méthode à c1 qui définira 'someEvent' sur null.
la source
Il vaut mieux utiliser
delegate { }
quenull
d'éviter l'exception de référence nulle.la source
List.Clear()
contremyList = null
.Définir l'événement sur null dans la classe fonctionne. Lorsque vous supprimez une classe, vous devez toujours définir l'événement sur null, le GC a des problèmes avec les événements et peut ne pas nettoyer la classe supprimée si elle a des événements en suspens.
la source
La meilleure pratique pour effacer tous les abonnés consiste à définir someEvent sur null en ajoutant une autre méthode publique si vous souhaitez exposer cette fonctionnalité à l'extérieur. Cela n'a pas de conséquences invisibles. La condition préalable est de ne pas oublier de déclarer SomeEvent avec le mot-clé 'event'.
Veuillez consulter le livre - C # 4.0 en bref, page 125.
Quelqu'un ici a proposé d'utiliser la
Delegate.RemoveAll
méthode. Si vous l'utilisez, l'exemple de code peut suivre le formulaire ci-dessous. Mais c'est vraiment stupide. Pourquoi pas justeSomeEvent=null
à l'intérieur de laClearSubscribers()
fonction?la source
Vous pouvez y parvenir en utilisant les méthodes Delegate.Remove ou Delegate.RemoveAll.
la source
Commentaire ennuyeux prolongé conceptuel.
J'utilise plutôt le mot "gestionnaire d'événements" au lieu de "événement" ou "délégué". Et utilisé le mot «événement» pour d'autres choses. Dans certains langages de programmation (VB.NET, Object Pascal, Objective-C), "event" est appelé "message" ou "signal", et a même un mot-clé "message" et une syntaxe de sucre spécifique.
Et, pour répondre à ce "message", un "gestionnaire d'événements" répond, qu'il s'agisse d'un seul délégué ou de plusieurs délégués.
Résumé: "Event" est la "question", "event handler (s)" are the answer (s).
la source
Voici ma solution:
Vous devez appeler
Dispose()
ou utiliser unusing(new Foo()){/*...*/}
modèle pour désinscrire tous les membres de la liste d'appel.la source
Supprimez tous les événements, supposons que l'événement est de type "Action":
la source
GetInvocationList
.Au lieu d'ajouter et de supprimer des rappels manuellement et d'avoir un tas de types de délégués déclarés partout:
Vous pouvez essayer cette approche générique:
la source