我一直在研究一些代码。我有一个问题:
这两个代码有什么区别?
using (FORM formExemple = new FORM ())
{
formExemple.ShowDialog();
}
和
FORM formExemple = new FORM ();
formExemple.ShowDialog();
答案 0 :(得分:8)
using
调用对象的Dispose()
方法,在完成后自行清理。它通常处理诸如关闭打开连接和/或释放内存之类的事情。如果以其他方式实例化,则必须手动执行此操作。您只能对实现using
接口的对象使用IDisposable
,这可确保对象存在方法Dispose()
。
答案 1 :(得分:6)
using块用于自动处理实现IDisposable
的对象。
第一个在块结束时调用Dispose()
。使用块还将确保在异常的情况下正确处理对象。
当开发人员确定他们不再需要该对象时,第二个不需要并且需要处理。
答案 2 :(得分:5)
与以往一样,请查阅文档 - MSDN C# guide for using
statements或C#规范(它是C#5规范中的8.13节)。
using
语句只能用于实现IDisposable
的类型,它基本上可以确保初始表达式(资源获取表达式)中出现的任何资源都是即使抛出异常,也会被置于块的末尾。您的第一个代码段大致相当于:
FORM formExemple = new FORM(); // I hope you don't *really* use these names
try
{
formExemple.ShowDialog();
}
finally
{
formExemple.Dispose();
}
除此之外还有一点点,请注意:
using
语句本身using
语句中变量的变化(原始值仍在处理中)基本上,它可以更容易地清理需要及时处理的资源 - 网络流,文件句柄,数据库连接,图形对象等。
答案 3 :(得分:4)
using
可以用于实现IDisposable接口的对象。使用使用的原因是,一旦完成表单,您不必担心任何清理,将调用表单上的Dispose方法并清除所有内容。
在你的第二个例子中,Dispose永远不会被调用,并且对象仍然在内存中,如果垃圾收集器没有意识到需要清理它,可能会暂时停用它。
答案 4 :(得分:2)
using-statement ...
using (Font font1 = new Font("Arial", 10.0f))
{
byte charset = font1.GdiCharSet;
}
...是以下模式的句法快捷方式(语法糖):
{
Font font1 = new Font("Arial", 10.0f);
try
{
byte charset = font1.GdiCharSet;
}
finally
{
if (font1 != null)
((IDisposable)font1).Dispose();
}
}
(我从上面的链接中拿了例子)
...因此,try
+ IDisposable.Dispose()
中对finally
的调用 - 两个代码段之间的差异。
答案 5 :(得分:-1)
using语句定义了formExemple的作用域,为usingExemple分配的内存将在using语句的控制之外释放一次。