下面两段代码有什么区别:

using (Object o = new Object())
{
    // Do something
}

{
    Object o = new Object();
    // Do something
}

我已经开始使用 using 更多,但我很好奇与范围对象相比,实际的好处是什么。

编辑: 我从中得到的有用花絮:

乔恩·斯基特:

请注意,这不会强制以任何方式、形式或形式进行垃圾收集。垃圾收集和及时资源清理在某种程度上是正交的。

威尔·埃丁斯评论:

除非您的类实现了 IDisposable 接口,并且具有 Dispose() 函数,否则您不要使用 using。

有帮助吗?

解决方案

在第一个片段在块的末尾呼吁Dispose - 你只能用它实现IDisposable类型做到这一点,它基本上调用finally块Dispose,这样你就可以与需要的资源清理类型,例如使用

using (TextReader reader = File.OpenText("test.txt"))
{
    // Use reader to read the file
}
// reader will be disposed, so file handle released

请注意,这不的力的垃圾收集以任何方式,形状或形式。垃圾收集和提示资源清理偏于正交。

基本上,你应该使用using语句相当多的东西,它实现IDisposable和你的代码块是要承担责任(在清理方面)。

其他提示

在......的最后 using 对象被释放(放在括号内的对象必须实现 IDisposable)。在异常情况下该对象也会被释放。而且你不必等待GC在某个时间来做这件事(你可以控制它)。

编辑:范围界定的缺点是:

  • 您无法控制对象的处置
  • 即使您在范围末尾调用 dispose,它也不会是异常安全的

只是从字面上示区别...

using (FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate))
{
  //stuff with file stream
}

是相同的...

{
  FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate);

  try
  {
    //stuff with filestream
  }
  finally
  {
    if (fileStream != null)
      ((IDisposable)fileStream).Dispose();
  }
}

其中如

{
  FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate);
  fileStream.Dispose();
}

是因为它是。

请参阅关于文档 IDisposable的和可确定的资源解除分配。

简单地说,在using{}块的末尾,可以可靠地处置分配的资源(例如靠近文件句柄,数据库连接等)

using只是需要IDisposable接口的实现,并调用在范围的端部的Dispose方法。

有关大量汹涌约正确处理对象的参数的,有大量的其他线程。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top