2009-04-03 3 views

Antwort

7

Ja; Stellvertreter werden auf der Instanz verglichen und MethodInfo; Wenn diese gleich sind, wird es funktionieren. Das Problem tritt auf, wenn versucht wird, eine anonyme Methode abzubestellen; In diesem Fall müssen Sie einen Verweis auf den Delegierten behalten, um sich abzumelden.

So:

Das ist in Ordnung:

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

Aber das ist viel riskanter:

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

Der richtige Prozess mit anonymen Methoden ist:

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

Versuchen Sie es mit

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

Dies sollte auch arbeiten (aus dem Gedächtnis - nicht wirklich getestet). Zumindest erzeugt es keine neue Eventhandler-Referenz.

+0

es eigentlich tut. Der Compiler erledigt das für Sie. – Samuel

+0

Ich habe es gerade getestet und - zumindest in meinem Test - nach dem Hinzufügen und Entfernen der Handler auf diese Weise funktioniert es. – Lennaert

+0

Dies ist einfach eine Abkürzung, die der Compiler immer noch in einen neuen EventHandler verwandelt. –

Verwandte Themen