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;
es eigentlich tut. Der Compiler erledigt das für Sie. – Samuel
Ich habe es gerade getestet und - zumindest in meinem Test - nach dem Hinzufügen und Entfernen der Handler auf diese Weise funktioniert es. – Lennaert
Dies ist einfach eine Abkürzung, die der Compiler immer noch in einen neuen EventHandler verwandelt. –