7

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

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

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

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

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

乔恩斯基特:

请注意,这不会以任何方式、形状或形式强制垃圾收集。垃圾收集和及时的资源清理有些正交。

将 Eddins 评论:

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

4

5 回答 5

20

第一个片段Dispose在块的末尾调用 - 你只能使用实现的类型来执行IDisposable它,它基本上Dispose在 finally 块中调用,所以你可以将它用于需要清理资源的类型,例如

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

请注意,这不会任何方式、形状或形式强制垃圾收集。垃圾收集和及时的资源清理有些正交。

using基本上,您应该对几乎任何实现IDisposable以及您的代码块将负责的事情(在清理方面)使用语句。

于 2009-10-30T16:15:22.560 回答
3

在对象的末尾using被释放(放在括号内的对象必须实现 IDisposable)。该对象也会在异常情况下被释放。而且您不必在某个时间等待 GC 执行此操作(您可以控制它)。

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

  • 您不控制对象的处置
  • 即使您在作用域结束时调用 dispose,它也不是异常安全的
于 2009-10-30T16:15:55.757 回答
3

只是为了从字面上显示差异......

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();
}

原样。

于 2009-10-30T16:55:23.290 回答
1

请参阅有关IDisposable和可确定资源释放的文档。

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

于 2009-10-30T16:16:04.383 回答
0

using只需要 IDisposable 接口的实现,并在作用域的末尾调用 Dispose 方法。

对于正确处理对象的大量激烈争论,还有很多其他线程。

于 2009-10-30T16:18:22.460 回答