Отказ от подписки на события в интерфейсе C # - необходимо? - PullRequest
4 голосов
/ 07 июля 2011

Я знаю, что отписаться от события необходимо. Мои вопросы приходят из сгенерированного кода: Когда вы изменяете пользовательский интерфейс из редактора VS и добавляете обработчик событий в элемент пользовательского интерфейса (например: private void BtnSampleClick(object sender, EventArgs e))

При создании этой обработки событий VS добавляет этот код в private void InitializeComponent() автоматически сгенерированный код

this.btnSample.Click += new System.EventHandler(this.BtnSampleClick);

Проблема в том, что VS не добавляет отписку (this.btnSample.Click -= new System.EventHandler(this.BtnSampleClick);) автоматически в метод Dispose формы.

Обычно мы должны добавлять их туда, верно? Если нет, это приведет к утечке памяти? Хотел проверить, была ли причина, по которой VS не выполняет отписку автоматически. Может быть, форма правильно расположена, даже если мы этого не делаем?

Спасибо за помощь в освещении этого вопроса!

Ответы [ 3 ]

6 голосов
/ 07 июля 2011

Это не сделано, главным образом потому, что это действительно не нужно в данном случае . Причина в том, что ваша Форма подписывается на события объектов, срок жизни которых управляется формой. Когда объект (т. Е. Кнопка) отменен с точки зрения ГХ, форма также будет удалена (и закрыта), поэтому вероятность утечки памяти отсутствует. GC в .NET умный - круговые ссылки вроде этого не проблема.

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

1 голос
/ 07 июля 2011

Да, хорошей практикой является явная отмена подписки.Хотя они могут вызывать утечки памяти, пока они не содержат никаких ссылок на неуправляемые объекты, GC все еще может правильно определять и очищать в управляемом мире.

0 голосов
/ 07 июля 2011

Вам не нужно заботиться об этом.Фреймворк Dot.NET имеет сборщик мусора (GC), который автоматически удаляется по собственному принципу (может быть, когда нет ссылки на оставленный объект).

Это не означает, что вам никогда не понадобится вызывать функцию Dispose, в некоторых случаях вы намеренно вызываете метод Dispose (), чтобы память не заканчивалась, или когда мы работаем с собственным классом dll / Marshal

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