145 votes

Comment puis-je effacer des abonnements aux événements en c# ?

Prendre la classe C#:

c1 {
 event EventHandler someEvent;
}

Si il y a un grand nombre d'abonnements à l' c1s' someEvent événement et je veux les supprimer tous, quelle est la meilleure façon d'atteindre cet objectif? Considèrent également que les souscriptions à cet événement pourrait être/sont les lambdas/anonyme délégués.

Actuellement, ma solution est d'ajouter un ResetSubscriptions() méthode de c1 qui définit someEvent de la valeur null. Je ne sais pas si cela a quelque invisible conséquences.

185voto

Jon Skeet Points 692016

À partir de l'intérieur de la classe, vous pouvez définir le (caché) de la variable à null. Une référence null est la manière canonique de représenter un vide liste d'invocation, de manière efficace.

À partir de l'extérieur de la classe, vous ne pouvez pas faire cela - événements fondamentalement exposer "s'abonner" et "se désabonner" et c'est tout.

Il vaut la peine d'être conscient de ce que le terrain, tels que les événements sont en train de faire - ils ont créé une variable et un événement en même temps. Au sein de la classe, vous en fin de référencer la variable. De l'extérieur, vous faites référence à l'événement.

Voir mon article sur les événements et les délégués pour plus d'informations.

34voto

user5289 Points 1342

Ajoutez une méthode à c1 qui définira 'someEvent' à null ...

 class c1
{
    event EventHandler someEvent;
    ResetSubscriptions() {someEvent = null;}
}
 

6voto

Définir l'événement sur null dans la classe fonctionne. Lorsque vous disposez d'une classe, vous devez toujours définir l'événement sur null, le GC a des problèmes avec les événements et ne peut pas nettoyer la classe éliminée si des événements sont en suspens.

6voto

Cary Points 73

La meilleure pratique pour effacer tous les abonnés est de définir la someEvent à null par l'ajout d'une autre méthode si vous souhaitez exposer cette fonctionnalité à l'extérieur. Cela n'a d'invisible conséquences. La condition préalable est de vous déclarer SomeEvent avec le mot-clé '"événement".

Veuillez voir le livre - C# 4.0 dans le mot, à la page 125.

public void ClearSubscribers ()
{
    SomeEvent = (EventHandler) Delegate.RemoveAll(SomeEvent, SomeEvent); //Then you will find SomeEvent is set to null.
}

Quelqu'un ici a proposé d'utiliser Délégué.RemoveAll méthode. Si vous l'utilisez, l'exemple de code pourrait suivre la façon décrite ci-dessus. Mais c'est vraiment stupide. Pourquoi ne pas simplement SomeEvent=null à l'intérieur de ClearSubscribers() la fonction?

5voto

Micah Points 28683

Vous pouvez y parvenir en utilisant les méthodes Delegate.Remove ou Delegate.RemoveAll.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X