代码之家  ›  专栏  ›  技术社区  ›  Kelsey

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

  •  7
  • Kelsey  · 技术社区  · 16 年前

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

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

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

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

    编辑: 我从中得到的有用的小道消息:

    乔恩·斯基特:

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

    艾丁会评论吗?

    除非类实现了IDisposable接口并具有dispose()函数,否则不使用。

    5 回复  |  直到 14 年前
        1
  •  20
  •   Jon Skeet    16 年前

    第一个片段调用 Dispose 在块的末尾,您只能用实现的类型来完成它。 IDisposable ,它基本上是 处置 在最后一个块中,这样您就可以使用需要清理资源的类型,例如

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

    请注意,这是 以任何方式、形状或形式强制垃圾回收。垃圾收集和即时资源清理有点正交。

    基本上,你应该使用 using 几乎所有实现 不可分的 以及你的代码块将负责的(在清理方面)。

        2
  •  3
  •   jdehaan    16 年前

    结束时 using 对象被释放(放入括号中的对象必须实现IDisposable)。在异常情况下也会释放该对象。而且您不必等待gc在某个时间执行它(您可以控制它)。

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

    • 你不能控制物体的处置
    • 即使在作用域的末尾调用dispose,它也不是异常安全的
        3
  •  3
  •   Sekhat    16 年前

    只是为了从字面上说明区别…

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

    就是这样。

        4
  •  1
  •   Brian Agnew    16 年前

    请参阅有关 IDisposable 以及可确定的资源释放。

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

        5
  •  0
  •   kamaci    14 年前

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

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