Анализ кода Жалуется на "Утилиту объектов CA2000 до потери области действия", когда я не утилизирую свою дочернюю форму MDI

CA2000 Утилизируйте объекты, прежде чем потерять прицел

В методе FormMain.barButtonItem1_ItemClick(object, ItemClickEventArgs)

Вызовите System.IDisposable.Dispose для объекта 'frm' до того, как все ссылки на него выйдут из области видимости. Winpro FormMain.cs 32

Метод:

private void barButtonItem1_ItemClick(object sender, ItemClickEventArgs e)
{
    FormCustomerList frm = new FormCustomerList();
    frm.MdiParent = this;
    frm.Show();
}

Это не серьезная проблема, но почему это происходит?

Я не могу использовать наконец frm.Dispose() или же using() потому что форма не будет показана.

Я также пытался обработать закрытие формы, а затем удалить, но нарушение всегда здесь.

1 ответ

Решение

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

"Правильный" способ справиться с этим - сохранить ссылку на frm в родительской форме. Эта ссылка затем может быть размещена в Dispose() метод родительской формы.

private FormCustomerList frm;
private void barButtonItem1_ItemClick(object sender, ItemClickEventArgs e)
{
    frm = new FormCustomerList();
    frm.MdiParent = this;
    frm.Show();
}

Если у вас есть несколько подформ, которые могут быть созданы (что, вероятно, если вы используете MDI), вы можете сохранить List<> детских форм.

private List<FormCustomerList> frms = new List<FormCustomerList>();
private void barButtonItem1_ItemClick(object sender, ItemClickEventArgs e)
{
    FormCustomerList frm = new FormCustomerList();
    frms.Add(frm);
    frm.MdiParent = this;
    frm.Show();
}
Другие вопросы по тегам