C# 代码分析抱怨;CA2000在失去作用域之前处理对象”;当我不';t处置我的MDI子窗体

C# 代码分析抱怨;CA2000在失去作用域之前处理对象”;当我不';t处置我的MDI子窗体,c#,winforms,code-analysis,ca2000,C#,Winforms,Code Analysis,Ca2000,CA2000在失去作用域之前处理对象 在方法FormMain.BarButtonim1\u ItemClick(对象,ItemClickEventArgs) 在对象“frm”上调用System.IDisposable.Dispose,然后对其进行所有引用,使其超出范围。Winpro FormMain.cs 32 方法: private void barButtonItem1_ItemClick(object sender, ItemClickEventArgs e) { FormCust

CA2000在失去作用域之前处理对象

在方法
FormMain.BarButtonim1\u ItemClick(对象,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();
}
这不是一个严重的问题,但为什么会被解雇

我不能使用finally
frm.Dispose()
using()
,因为表单不会显示


我也尝试过处理表单关闭,然后进行处理,但冲突始终存在。

代码分析无法判断frm在退出范围后仍在执行任何操作。在这种特定情况下,对象需要在函数完成后保持活动状态

处理此问题的“正确”方法是在父窗体中维护对
frm
的引用。然后可以在父窗体的
Dispose()
方法中释放此引用

private FormCustomerList frm;
private void barButtonItem1_ItemClick(object sender, ItemClickEventArgs e)
{
    frm = new FormCustomerList();
    frm.MdiParent = this;
    frm.Show();
}
如果可以创建多个子表单(如果使用MDI,很可能会创建多个子表单),则可以维护子表单的
列表

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();
}
private List frms=new List();
私有void BarbuttonItemClick(对象发送者,ItemClickEventArgs e)
{
FormCustomerList frm=新的FormCustomerList();
frms.添加(frm);
frm.MdiParent=此;
frm.Show();
}

在表单关闭之前不显示
块?在这种情况下,您可以在之后调用dispose。否则,您需要在成员中保留一个引用,以便以后处理它。“我不能使用finally frm.dispose()或using(),因为表单将不会显示”-请显示您尝试此操作的代码,因为这应该可以正常工作。这是一个错误警告。(在这个非常具体的案例中)。调用Dispose将销毁子窗体。我认为MDI容器知道在关闭它时如何处理其子窗体。如果您搜索
CA2000假阳性
,您应该会找到数千个链接,解释您为什么会收到此消息(这是一个代码分析器警告,而不是编译器警告)@Lee
ShowDialog
块<代码>显示不显示。