Подтвердить что ты не робот

Как удалить обработчик события с - = работать, когда указано "новое" событие

В 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, "- = новый" просто выглядит неправильно. Почему в этом списке есть ссылка на обработчик событий, который я только что создал?

Очевидно, я должен думать о вещах не так? Могу ли я получить указатель на техническое объяснение того, как - = работает, видя, как - =, похоже, не использует его.

4b9b3361

Ответ 1

Да, это путающий синтаксис. Объект делегата должен быть создан до того, как обработчик может быть удален из события. Именно поэтому С# поддерживает этот синтаксис:

 List.Changed -= ListChanged;

который выглядит более логичным. Однако компилятор генерирует точный код. Под капотом метод MulticastDelegate.RemoveImpl() выполняет итерацию списка вызовов и удаляет объекты делегата из этого списка, свойства Target и Method которого соответствуют.

Ответ 2

Отмена подписки на события использует равенство ценности, а не ссылочное равенство. Таким образом, вновь созданный делегат соответствует старому (оба целевого объекта и метода одинаковы) и таким образом удаляет старый делегат из списка вызовов.