2014-01-22 4 views
1

объекты CA2000 Dispose до потери сферыАнализ кода Жалуется об «объектах CA2000 Dispose до потери рамки», когда я не выбрасывайте свою форму MDI Child

В методе 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

Не раскрывает ли блок «Показывать» до тех пор, пока форма не будет закрыта? В этом случае вы можете вызвать dispose после. В противном случае вам нужно сохранить ссылку в члене, чтобы позже вы могли его использовать. – Lee

+1

_ «Я не могу использовать окончательно frm.Dispose() или using(), потому что форма не будет отображаться» _ - пожалуйста, покажите код, где вы это пробовали, так как это должно работать. – CodeCaster

+1

Это ложное предупреждение. (В этом очень конкретном случае). Вызов Dispose уничтожит дочернюю форму. Я думаю, что MDI Container знает, как распоряжаться своими дочерними элементами, когда вы его закрываете. Если вы ищете 'CA2000 false positive', вы должны найти тысячи ссылок, которые объяснят, почему вы получаете это сообщение (и это предупреждение кода-анализа, а не предупреждение компилятора) – Steve

ответ

2

Анализ кода не может сказать, что 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(); 
} 
Смежные вопросы