Как удалить обработчик события с - = работать, когда указано "новое" событие
В MSDN Учебное пособие по событиям подключение к событиям показано на примере:
// Add "ListChanged" to the Changed event on "List":
List.Changed += new ChangedEventHandler(ListChanged);
...
// Detach the event and delete the list:
List.Changed -= new ChangedEventHandler(ListChanged);
Где я держу ссылку на делегата. Пример:
ChangedEventHandler myChangedEvent = new ChangedEventHandler(ListChanged);
List.Changed += myChangedEvent;
...
List.Changed -= myChangedEvent;
Когда я смотрю пример кода MSDN, "- = новый" просто выглядит неправильно. Почему в этом списке есть ссылка на обработчик событий, который я только что создал?
Очевидно, я должен думать о вещах не так? Могу ли я получить указатель на техническое объяснение того, как - = работает, видя, как - =, похоже, не использует его.
Ответы
Ответ 1
Да, это путающий синтаксис. Объект делегата должен быть создан до того, как обработчик может быть удален из события. Именно поэтому С# поддерживает этот синтаксис:
List.Changed -= ListChanged;
который выглядит более логичным. Однако компилятор генерирует точный код. Под капотом метод MulticastDelegate.RemoveImpl() выполняет итерацию списка вызовов и удаляет объекты делегата из этого списка, свойства Target и Method которого соответствуют.
Ответ 2
Отмена подписки на события использует равенство ценности, а не ссылочное равенство. Таким образом, вновь созданный делегат соответствует старому (оба целевого объекта и метода одинаковы) и таким образом удаляет старый делегат из списка вызовов.