Почему нельзя отменить регистрацию событий формы? [дубликат]C#

Место общения программистов C#
Anonymous
Почему нельзя отменить регистрацию событий формы? [дубликат]

Сообщение Anonymous »

Форма Dispose по умолчанию будет выглядеть примерно так:

Код: Выделить всё

protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
Обычный шаблон удаления требует освобождения управляемых ресурсов:

Код: Выделить всё

protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Free other state (managed objects).
}
// Free your own state (unmanaged objects).
// Set large fields to null.
disposed = true;
}
}
Включая отмену регистрации от событий:

Хорошо ли отменять регистрацию от внешних событий в методе Dispose Класс IDiposable?

Плохо ли не отменять регистрацию обработчиков событий?

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

Насколько я понимаю, цель отмены регистрации событий — разорвать циклическую ссылку, которая сдерживает сборщик мусора:

Изображение


Но многие мнения утверждают, что вам не нужно разрывать этот цикл, если элемент, на который вы подписались, «недолговечен» или принадлежит form и построен с помощью дизайнера.

Умеет ли компоненты.Dispose() или base.Dispose(dispositing) каким-то образом установить мой локальный частный System. Windows.Forms.Button button1 ссылка на ноль или отмену регистрации моего обработчика событий this.button1.Click += new System.EventHandler(this.button1_Click);? Не похоже, что компоненты когда-либо инициализируются, поэтому компоненты.Dispose() даже не будут запущены? Мы хотим, чтобы кнопка button1 просуществовала недолго и исчезла вместе с формой, но разве у нас здесь нет ссылочного цикла, который также не позволяет сборщику мусора выполнить очистку?

Подробнее здесь: https://stackoverflow.com/questions/344 ... registered

Вернуться в «C#»