Отменить регистрацию событий с новым экземпляром делегата - PullRequest
3 голосов
/ 03 апреля 2009
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());
 }

Это записывает Same! в консоль.

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

После выполнения этого кода EventHandler не зарегистрировано?

Ответы [ 2 ]

7 голосов
/ 03 апреля 2009

Да; сравниваются делегаты на экземпляре и MethodInfo; если они одинаковы, то это будет работать. Проблема возникает при попытке отписаться от анонимного метода; в этом случае вы должны сохранить ссылку на делегата, чтобы отписаться.

Итак:

Это нормально:

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

Но это намного опаснее:

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

Правильный процесс с анонимными методами:

EventHandler handler = delegate {Trace.WriteLine("Foo");};
control.SomeEvent += handler;
//...
control.SomeEvent -= handler;
0 голосов
/ 03 апреля 2009

Попробуйте использовать

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

Это также должно работать (из памяти - на самом деле не проверял). По крайней мере, это не создает новую ссылку на обработчик событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...