Что это означает в C #: использование оператора - = по событиям? - PullRequest
7 голосов
/ 02 марта 2010

Когда мы должны использовать этот оператор по событиям? Каково его использование?

Ответы [ 5 ]

15 голосов
/ 02 марта 2010

Так же, как + = подписывает вас обработчиком на событие, - = отменяет его подписку.

Используйте его, когда вы больше не хотите, чтобы определенный обработчик вызывался при возникновении события. Вам часто нужно использовать его только в том случае, если компонент, вызывающий событие, логически дольше живет, чем обработчик события. Если вы не отмените подписку, «сборщик событий» фактически имеет ссылку на обработчик, поэтому он может поддерживать его дольше ты хочешь.

Как отмечено в комментариях:

  • -= удалит только один обработчик; если подписано несколько обработчиков (даже с использованием одного и того же делегата), это все равно только уменьшит количество обработчиков на 1. Последний экземпляр указанного обработчика - тот, который удален. (Таким образом, если ранее у вас были обработчики A, B, A, C в этом порядке и вы удалили A, вы получите A, B, C.)
  • -= не вызывает ошибку, если указанный обработчик еще не подписан на делегат; он просто игнорирует запрос. Это верно, даже если у события нет подписчиков, подписанных на него в данный момент.
7 голосов
/ 02 марта 2010

Так же, как вы можете добавить обработчики событий через +=, вы можете удалить их через -=.

Например:

mybutton.Click += new EventHandler(myhandler);

Позже вы можете удалить его так:

mybutton.Click -= new EventHandler(myhandler);

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

3 голосов
/ 02 марта 2010

Операторы += и -= могут использоваться в C # для добавления / удаления обработчиков событий в / из одного из событий объекта:

// adds myMethod as an event handler to the myButton.Click event
myButton.Click += myMethod;

После выполнения приведенного выше кода метод myMethod будет вызываться при каждом нажатии myButton.

// removes the handler
myButton.Click -= myMethod;

После запуска вышеуказанного кода нажатие на myButton больше не вызовет вызов myMethod.

1 голос
/ 15 мая 2013

Я подозреваю, что фоновая логика + = заключается в добавлении обработчика в список / массив обработчиков событий для данного события. Когда используется - =, он сравнивает ваш правый аргумент со списком обработчиков событий, которые он содержит для этого события, и удаляет его из списка. Если вы сделаете несколько + = для данного события, будет вызван каждый обработчик.

Заявлено иначе: + = означает добавление метода в список методов для вызова при возникновении события. - = означает удалить указанный метод из списка методов для вызова.

Если все будут удалены, событие не будет иметь обработчиков и событие будет игнорироваться.

1 голос
/ 02 марта 2010

Вы удаляете функцию Eventhandler. C # Учебник, События и Делегаты

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