0

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

这两个代码有什么区别?

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

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

6 回答 6

8

using完成后调用对象的Dispose()方法进行清理。它通常处理诸如关闭打开的连接和/或释放内存之类的事情。如果您以其他方式实例化它,则必须手动执行此操作。您只能using在实现该IDisposable接口的对象上使用,这可以确保Dispose()该对象存在方法。

于 2012-09-26T20:26:00.680 回答
6

using 块用于自动处理实现IDisposable. 第一个Dispose()在块的末尾被调用。using 块还将确保在发生异常时正确处理对象。

当开发人员确定他们不再需要该对象时,第二个不需要并且需要由开发人员处理。

于 2012-09-26T20:25:45.830 回答
5

与以往一样,请查阅文档 -语句的MSDN C# 指南using或 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它处理语句中变量的变化(原始值仍然被释放)

基本上,它可以更轻松地清理需要及时处理的资源——网络流、文件句柄、数据库连接、图形对象等。

于 2012-09-26T20:26:10.893 回答
4

using是您可以与已实现 IDisposable 接口的对象一起使用的东西。使用 using 的原因是一旦你完成了你的表单,你不必担心任何清理工作,Form 上的 Dispose 方法将被调用,一切都会被清理。

在您的第二个示例中,从未调用 Dispose 并且对象仍在内存中,并且如果垃圾收集器无法识别它需要清理它,则可能会存在一段时间。

于 2012-09-26T20:26:55.247 回答
2

使用语句...

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+ 对 -block 的IDisposable.Dispose()调用finally

于 2012-09-26T20:27:31.860 回答
-1

using 语句定义了 formExemple 的范围,一旦超出 using 语句的控制,为 formExemple 分配的内存将被释放。

于 2012-09-26T20:26:21.977 回答