Должен ли я всегда отключать обработчики событий в методе Dispose?

Я работаю на C #, и мое рабочее место имеет некоторые стандарты кода. Один из них заключается в том, что каждый обработчик событий, который мы связываем (например, KeyDown ), должен быть отключен в методе Dispose . Есть ли веская причина для этого?

2 Solutions collect form web for “Должен ли я всегда отключать обработчики событий в методе Dispose?”

Если вы не ожидаете, что издатель события переживет абонента, нет причин удалить обработчик событий, нет.

Это одна из тех тем, где народные знания выросли. Вам просто нужно подумать об этом в обычном режиме: издатель (например, кнопка) имеет ссылку на подписчика. Если и издатель, и подписчик будут иметь право на garbage collection в одно и то же время (как это обычно бывает) или если издатель будет иметь право на garbage collection раньше , то нет проблемы с ГХ.

Статические события вызывают проблему с GC, потому что они фактически являются издателем бесконечно долгоживущих – я, по возможности, мог бы избежать статических событий. (Я очень редко считаю их полезными.)

Другая возможная проблема заключается в том, что вы явно хотите прекратить прослушивание событий, потому что ваш объект будет плохо себя вести, если событие будет поднято (например, он попытается записать в закрытый stream). В таком случае, да, вы должны удалить обработчик. Скорее всего, это будет в случае, когда ваш class уже реализует IDisposable . Было бы необычно – хотя и не невозможно – для того, чтобы реализовать IDisposable просто удалить обработчики событий.

У меня была большая утечка GDI в моем приложении, если я не отменил регистрацию обработчиков событий в Dispose () пользовательского элемента управления, который динамически создавался и уничтожался. Я нашел следующее в справке Visual Studio 2013 в Руководстве по программированию на C #. Обратите внимание на то, что я выделил курсивом:

Как подписаться на и отменить подписку на события

… чик …

Отказ от подписки

Чтобы предотвратить выключение обработчика события при возникновении события, отмените подписку на событие. Чтобы предотвратить утечку ресурсов, вы должны отказаться от подписки на события перед тем, как избавиться от объекта-подписчика. Пока вы не отмените подписку на событие, делегат многоадресной передачи, который лежит в основе события в объекте публикации, имеет ссылку на делегата, который инкапсулирует обработчик события абонента. Пока объект публикации сохраняет эту ссылку, garbage collection не будет удалять ваш объект-подписчик.

Обратите внимание, что в моем случае как издатель, так и подписчик были в одном classе, а обработчики не являются статическими.

  • Каковы различия между делегатами и событиями?
  • Получить значения DataKey в GridView RowCommand
  • Событие jquery live для добавления элементов dom
  • Понимание событий и обработчиков событий в C #
  • Суперпростой пример наблюдателя C # / наблюдаемого с делегатами
  • Определите, будет ли пользователь щелкать полосу прокрутки или содержимое (onclick для собственной полосы прокрутки)
  • Как изменить Form1 label.text при установке флажка на form2?
  • выбрать событие выбора jquery select
  • iOS - нажимать вперед все
  • Пользовательский прослушиватель событий в приложении для Android
  • Как получить подписчиков мероприятия?
  • Interesting Posts

    Создайте перечисление со строковыми значениями в TypeScript

    Обнаружение статуса двух SIM-карт в телефоне с двумя SIM-картами

    Есть ли разница в производительности между объединением соединений или каналов в rabbitmq?

    Как заставить свой путь в BIOS / UEFI?

    Время ожидания NSURLConnection?

    Как можно обнаружить режим самолета на Android?

    Лучшая практика для внедрения отказоустойчивого инициализатора в Swift

    C – распределение матрицы в функции

    Как сделать чтение из таймаута std :: cin` через определенное количество времени

    CSS3 Анимация и отображение Нет

    Android 1.6: «android.view.WindowManager $ BadTokenException: Невозможно добавить окно – токен null не для приложения»

    Краткое объяснение Async / Await в .Net 4.5

    Есть ли способ заставить ПК выглядеть как USB-накопитель на устройстве, которое считывает содержимое с USB-накопителя?

    Delphi: Нарушение доступа в конце конструктора Create ()

    Как включить стандартную копию для TextView в Android?

    Давайте будем гением компьютера.