Синтаксис удаления событий C # - PullRequest
8 голосов
/ 27 августа 2009

Я смущен синтаксисом для удаления обработчиков событий в C #.

Something += new MyHandler(HandleSomething); // add
Something -= new MyHandler(HandleSomething); // remove

"new" создает новый объект в каждой строке, поэтому вы добавляете один объект и затем попросите его удалить другой объект.

Что на самом деле происходит под прикрытием, что это может работать?
Это не очевидно из синтаксиса.

Ответы [ 3 ]

19 голосов
/ 27 августа 2009

+ = и - = - это синтаксические ярлыки для встроенных внутренних методов с именами Add () и Remove (), которые добавляют или удаляют указатель на внутренний связанный список делегатов, который делегат имеет в качестве частного поля. , Когда вы запускаете Remove, он начинается с заголовка связанного списка и проверяет каждый делегат в списке по одному, пока не найдет тот, который "равен" тому, который вы передали методу Remove (). (используя - = синтаксис)

Затем он удаляет его из связанного списка и исправляет связанный список, чтобы сохранить его связность ...

В этом контексте метод «равно» (для делегата ()) переопределяется, так что он сравнивает только цель делегата и methodPtr, который будет одинаковым, даже если вы создали новый делегат для перейти к Удалить ...

7 голосов
/ 27 августа 2009

«Новый MyHandler» фактически избыточен. Вы можете просто сделать

Something += HandleSomething; // add
Something -= HandleSomething; // remove

Все события в C # являются многоадресными делегатами, поэтому синтаксис + = и - = указывает, что вы добавляете / удаляете делегата в список вызываемых делегатов.

Что касается того, что происходит за кулисами, лучшее объяснение, которое я нашел, это Джон Скит .

0 голосов
/ 27 августа 2009

Вы можете думать о событиях как о методах-заполнителях для делегированной логики, которая выполняется при возникновении события. У одного события может быть несколько подписчиков (многоадресная передача), поэтому синтаксис + = и - = - это способ подключения или удаления одного обработчика события. Простое выполнение задания сбрасывает подписки на событие, что может вызвать нежелательные побочные эффекты.

РЕДАКТИРОВАТЬ: эта ссылка объясняет больше о событиях в C #

...