C# #:";使用;在实例化表单时?
我在看别人写的一些C代码。无论何时实例化并显示表单,都会执行以下操作。这是正确的吗?在这种情况下,为什么要使用“using”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方法,并保证在该时
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
块允许表单在处理完资源后立即清理资源。