“使用”和范围界定之间的区别?

时间:2009-10-30 16:13:48

标签: c# scope using

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

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

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

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

编辑:我从中获取了有用的花絮:

Jon Skeet:

  

请注意,这不会以任何方式,形状或形式强制进行垃圾收集。垃圾收集和快速资源清理有点正交。

Eddins会发表评论:

  

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

5 个答案:

答案 0 :(得分:20)

第一个代码段在块的末尾调用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的任何事情,以及你的代码块将负责(在清理方面)。

答案 1 :(得分:3)

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

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

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

答案 2 :(得分: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();
}

就是这样。

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

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