Задать вопрос

Нужно ли выполнять отписку от события, содержащемся в объекте, который будет собран GC?

Доброго времени суток, появился небольшой вопрос.
Имеется класс, например некий Task. Он содержит в себе событие TaskComplete, на которое кто-нибудь подписался. И есть некий класс Ship, содержащий свойство CurrentTask типа Task (ну или поле, не суть важно). Предположим, задача выполнена и CurrentTask присваивается другой экземпляр Task или null. Логично, что старый экземпляр будет через некоторое время собран GC.
Вроде бы очевидно, что собрано будет все и никаких проблем от того, что на то событие был кто-то подписан не будет (в отличие от обратной операции, когда удаляется подписчик, естественно). Но на всякий случай уточню - правильно ли я понимаю, что выполнять отписку от события, которое скоро будет собрано GC, нет смысла и это не приведет к memory leak?
  • Вопрос задан
  • 651 просмотр
Подписаться 3 Оценить 4 комментария
Решение пользователя MrDywar Pichugin К ответам на вопрос (3)
Is it necessary to explicitly remove event handler...
Отвечает Jon Skeet.

.. The tricky case is when the publisher is long-lived but the subscribers don't want to be - in that case you need to unsubscribe the handlers..

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

Я представляю себе это как от дерева отпала ветка на которой есть другие веточки с листьями, внутри они сами на себя могут ссылаться сколь угодно, но т.к. нет ссылки на само дерево их породившее, то такая ветка будет собрана GC.
Ответ написан
Комментировать