在没有立即关闭的情况下处理新表格的正确方法是什么?

jav*_*n27 7 .net c# dispose winforms

所以在我的应用程序中,我倾向于动态创建表单的新实例,然后使用Form.Show()来显示它们(非模态).

private void test_click(object sender, EventArgs e)
{
    var form = new myForm();
    form.Show();
}
Run Code Online (Sandbox Code Playgroud)

但是,Code Cracker告诉我应该处理这些表格.所以,我用"使用"语句包装它们,但随后它们在打开后立即关闭.

using (var form = new myForm())
{
    form.Show();
}
Run Code Online (Sandbox Code Playgroud)

我不想使用Form.ShowDialog(),因为在少数情况下我打开只显示报告的新窗口; 我不需要它们是模态的.

Rez*_*aei 13

表格关闭后是否需要处理表格?

当您关闭a时Form,WM_CLOSE将向窗口发送一条消息.如果你看一下WmClose处理WM_CLOSE消息的方法的源代码,你会看到:

  • 对于模态表单(您使用它显示ShowDialog),该Dispose方法将不会被调用,并且表单在关闭后存在,您可以使用其属性来获取某些数据,或者您可以再次显示它.

  • 对于非模态表单(您显示使用Show),在表单关闭后,Dispose将调用该方法.

所以这是结论:

  • 当您使用Show方法显示表单时,您不需要(也不能)调用Dispose.表格将在关闭后自行处理.

  • 使用ShowDialog时需要Dispose手动调用表格.一个好的做法是在using块中使用模态形式.

  • 谢谢,知道非模态表单会自动获得处理调用,而模型表单不会,这非常有用。 (2认同)

Han*_*ant 7

嗯,"代码破解者"似乎是该工具的一个非常合适的术语,它的建议肯定会让你编写破坏你的程序的代码.Golden Rule 永远不会相信静态代码分析工具提供的IDisposable建议,他们都没有对代码执行有足够的洞察力.他们永远无法弄清楚哪个Dispose()调用完成了工作.

它看不到的是Form类已经知道如何处置它自己.它很容易这样做,当窗口关闭时,对象变得无法使用.当没有窗口时,没有理由继续使用Form对象.这种奢侈品在.NET中并不常见,但肯定受到45年前为Xerox工作的非常聪明的程序员的启发.

您必须记住一条特殊规则,当您使用ShowDialog()显示窗口时,它不会自行处理.这是故意的,它使得检索对话结果风险太大.对ShowDialog()调用使用using语句非常容易,在窗口关闭之前调用不会返回.