使用“using”实例化和简单实例化之间有什么区别

时间:2012-09-26 20:23:35

标签: c#

我一直在研究一些代码。我有一个问题:

这两个代码有什么区别?

using (FORM formExemple = new FORM ())
{
formExemple.ShowDialog();
}

FORM formExemple = new FORM ();
formExemple.ShowDialog();

6 个答案:

答案 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语句的控制之外释放一次。

相关问题