Если Form1 открывает Form2 и регистрируется для Form2.TextChanged, нужно ли мне отменить регистрацию Form2.TextChanged в Form1, если Form2 закрывается? - PullRequest
1 голос
/ 14 сентября 2011

Это еще один вопрос о том, как правильно избавляться от объектов из .NET. Прочитав много разных статей об утилизации лучших практик (и мнений людей), я не смог получить ответ на этот вопрос. У меня есть 2 формы, Form1 и Form2.

Form1

void ShowFormButton_Click(object sender, eventargs e)
{
    Form2 form = new Form2();
    form.TextChanged += new eventhandler(form_TextChanged);
    form.Show(this);
}

Form2

void CloseFormButton_Click(object sender, eventargs e)
{
    Close();
}

При вызове Close () в Form2, Form2 должен иметь вызов метода dispose (), потому что он был открыт с помощью вызова метода Show (), а поскольку Form1 зарегистрировалась для события TextChanged или Form2, это не позволит Form2 утилизировать или сделать процесс утилизации ГХ менее эффективным?

Заранее спасибо

1 Ответ

1 голос
/ 14 сентября 2011
Form2 form = new Form2(); 
form.TextChanged += new eventhandler(form_TextChanged);

Это означает, что экземпляр Form2 имеет ссылку на метод Form1 form_TextChanged. Когда форма Form2 закрыта, это не мешает ее собирать, поэтому в этом случае отмена подписки не является обязательной.

Предположим, что Form2 подписывается на событие Form1. В этом случае, когда форма Form2 закрыта, форма Form1 по-прежнему имеет активную ссылку на форму Form2, и форму Form2 невозможно собрать, что приводит к утечке памяти.

Таким образом, ответ зависит от направления подписки и источника события / времени жизни подписчика. В любом случае, если что-то не понятно, лучше отменить регистрацию событий.

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