C# #:";使用;在实例化表单时?

C# #:";使用;在实例化表单时?,c#,winforms,C#,Winforms,我在看别人写的一些C代码。无论何时实例化并显示表单,都会执行以下操作。这是正确的吗?在这种情况下,为什么要使用“using” MyForm f; using (f = new MyForm()) { f.ShowDialog(); } 补充问题: 以下代码是否可以替换 using (MyForm f = new MyForm()) { f.ShowDialog(); } 这将MyForm对象f持有的资源限制为using块。当该块退出时,将调用其Dispose方法,并保证在该时

我在看别人写的一些C代码。无论何时实例化并显示表单,都会执行以下操作。这是正确的吗?在这种情况下,为什么要使用“using”

MyForm f;
using (f = new MyForm())
{
    f.ShowDialog();
}
补充问题:

以下代码是否可以替换

using (MyForm f = new MyForm())
{
    f.ShowDialog();
}

这将MyForm对象f持有的资源限制为using块。当该块退出时,将调用其Dispose方法,并保证在该时间“Dispose”该块。因此,它所拥有的任何资源都将得到决定性的清理。此外,不能修改f以引用使用块中的另一个对象。有关更多详细信息,请参阅有关在MSDN中使用的信息:


也许吧。如果MyForm实现IDisposable,这将确保在调用ShowDialog时引发异常时调用Dispose方法


否则,除非您想立即强制处置,否则不需要使用。WinForms中的
表单实现了
IDisposable
模式(它继承了
组件的
IDisposable
。原始作者正确地确保值将通过
using
语句进行处理。

是的,这是IDisposable的“正确”用法。也许MyForm的作者有一些大对象(比如大内存流)或文件资源(例如,一个打开的文件流),它打开并希望确保尽快发布。在using语句中调用MyForm ctor在这种情况下会很有帮助

问题2:

在C#3.0+中,您可以使用较短的(同样清晰):


使用(var f=new MyForm())

using块不限制对象的生存期。它提供了调用Dispose的确定时间。在Dispose调用后,对象仍然非常活跃。通常,Dispose函数将清理对象中的资源,使其变得无用,但您的观点很好,我将更正我的答案。NEGC肯定不能保证垃圾收集具有这种确定性。类似地,GC不会调用Dispose方法。GC可以将对象放在最终确定队列上,但确保调用Dispose将阻止GC这样做(假定Dispose抑制最终确定,它应该在任何可最终确定的类中这样做).+1:我可以看到这在Winforms+MVP中很好地使用。我不知道show dialog后的代码是否会使表单被释放,甚至被执行。你应该解释一下,当表单关闭时,调用ShowDialog永远不会释放表单。阅读备注部分的第2段,如果表单很快超出范围,那么是否需要释放t表单?@Craig yes。当表单超出范围(假设没有其他引用)时,它就有资格进行收集,这可能会在稍后发生。只有在稍后的时间,表单才能清理资源。
using
块允许表单在处理完资源后立即清理资源。