С# Явное удаление обработчиков событий
Мне было интересно, будет ли установка объекта нулевым будет очищать любые обработчики событий, привязанные к событиям объектов...
например.
Button button = new Button();
button.Click += new EventHandler(Button_Click);
button = null;
button = new Button();
button.Click += new EventHandler(Button_Click);
button = null;
и т.д...
Будет ли это причиной утечки памяти?
Ответы
Ответ 1
Если в любом случае нет ссылок на button
, то здесь нет необходимости удалять обработчик событий, чтобы избежать утечки памяти. Обработчики событий являются однонаправленными ссылками, поэтому их удаление требуется только тогда, когда объект с событиями является долговечным, и вы хотите, чтобы обработчики (т.е. Объекты с методами обработчика) не проживали дольше, чем должны. В вашем примере это не так.
Ответ 2
Сводка: вам нужно явно отказаться от подписки, когда источник/издатель событий долгоживущий, а подписчики - нет. Если источник событий изживает подписчиков, все зарегистрированные подписчики сохраняются "живыми" источником событий (не собираются GC), если они не отписываются (и удаляют ссылку на себя из списка уведомлений издателя событий).
Также это дубликат
Нужно ли явно удалять обработчики событий в С# и иметь хороший ответ n. Поэтому голосование закрывается.
Ответ 3
См. обсуждение здесь в разделе "Последний вопрос: нужно ли нам удалять обработчики событий?"
Вывод: вы должны удалить делегаты от событий, когда они достигают вне самого класса; т.е. когда вы подписываетесь на внешние события, вы должен прекратить подписку, когда вы сделано. В противном случае будет сохраняться ваш объект жив дольше, чем необходимо.