2009-04-03 4 views
3
EventHandler a = new EventHandler(control_RegionChanged); 
EventHandler b = new EventHandler(control_RegionChanged); 

if (a == b) 
{ 
    Console.WriteLine("Same!"); 
} 
else 
{ 
    Console.WriteLine(a.GetHashCode() + " " + b.GetHashCode()); 
} 

Cela écrit Same! sur la console.Annulation de l'enregistrement des événements avec une nouvelle instance du délégué

control.RegionChanged += new EventHandler(control_RegionChanged); 
control.RegionChanged -= new EventHandler(control_RegionChanged); 

Après exécution de ce code, est le EventHandler non enregistré?

Répondre

7

Oui; délégués sont comparés sur l'instance et MethodInfo; si ce sont les mêmes, cela fonctionnera. Le problème vient lorsque vous essayez de vous désabonner d'une méthode anonyme; dans ce cas, vous devez conserver une référence au délégué pour vous désinscrire.

Alors:

C'est très bien:

control.SomeEvent += obj.SomeMethod; 
//... 
control.SomeEvent -= obj.SomeMethod; 

Mais ce qui est beaucoup plus risqué:

control.SomeEvent += delegate {Trace.WriteLine("Foo");}; 
//... 
control.SomeEvent -= delegate {Trace.WriteLine("Foo");}; 

Le processus correct avec des méthodes anonymes est:

EventHandler handler = delegate {Trace.WriteLine("Foo");}; 
control.SomeEvent += handler; 
//... 
control.SomeEvent -= handler; 
0

Essayez d'utiliser

control.RegionChanged += control_RegionChanged 
control.RegionChanged -= control_RegionChanged 

Cela devrait également travailler (de la mémoire - n'a pas vraiment testé). Au moins, il ne crée pas de nouvelle référence d'événement.

+0

En fait, il Est-ce que. Le compilateur le fait pour vous. – Samuel

+0

Je viens de le tester, et - au moins dans mon test - après avoir ajouté et supprimé le gestionnaire de cette façon, cela fonctionne. – Lennaert

+0

Ceci est simplement un raccourci, que le compilateur transforme encore en un nouveau gestionnaire d'événements. –

Questions connexes