C# 代码分析抱怨;CA2000在失去作用域之前处理对象”;当我不';t处置我的MDI子窗体
CA2000在失去作用域之前处理对象 在方法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
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();
}
这不是一个严重的问题,但为什么会被解雇
我不能使用finallyfrm.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假阳性
,您应该会找到数千个链接,解释您为什么会收到此消息(这是一个代码分析器警告,而不是编译器警告)@LeeShowDialog
块<代码>显示不显示。