代码分析当我不处理我的MDI子表单时,抱怨“CA2000在丢失范围之前处理对象”

时间:2014-01-22 11:37:00

标签: c# winforms code-analysis ca2000

CA2000在丢失范围之前处置对象

方法FormMain.barButtonItem1_ItemClick(object, ItemClickEventArgs)

在对对象'frm'调用System.IDisposable.Dispose之前,对它的所有引用都超出范围。 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 个答案:

答案 0 :(得分: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();
}