Нужно ли отписываться от событий в .net winforms app?

В данный момент пишу winforms app. Например, если я в конструкторе формы подписался на какое-либо событие, то нужно ли мне от него отписываться и когда? Если не нужно то почему?

public partial class Main: Form {
        public Main() {
        	InitializeComponent();
		this.tree.FilterNode += OnFilterNode;
        }
}


Понятно, что если я проектирую свои собственные классы (оповещатель и подписчик), отписываться от событий мне придется ручками, например в методе Dispose(). Здесь именно вопрос про winforms.
  • Вопрос задан
  • 4727 просмотров
Решения вопроса 1
aush
@aush
Нельзя дать общий ответ на этот вопрос.

Обычно, когда вы в конструкторе (или на Load) формы подписываетесь на события чайлдовых контролов, отписываться от них нет необходимости.

Но, если обработчик события содержит ссылку на объект, время жизни которого меньше времени жизни формы, то он не будет собран сборщиком мусора до того, как произойдет отписка от события. В этом случае, у вас должно быть какое-то событие, по которому вы сможете определить, что объект больше не используется и в ответ на это событие очистить ваши подписки.

Проще говоря, инициатором очистки подписки будет некая третья сторона. В designer.cs вашей формы уже есть Dispose(), который обычно и вызвается "третьей стороной" (WinForms фреймворком), поэтому вам не нужно об этом задумываться в большинстве случаев.

Скорее всего, если у вас сейчас возникает такой вопрос, то вам действительно не стоит задумываться об отписке от таких событий, а когда у вас появится задача соответствующего уровня, вы уже сами сможете разобраться, когда нужно отписываться.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы