C# 与x27之间的差异;使用';范围界定?

C# 与x27之间的差异;使用';范围界定?,c#,scope,using,C#,Scope,Using,以下两段代码之间的区别是什么: using (Object o = new Object()) { // Do something } 及 我已经开始更多地使用和了,但我很好奇与作用域对象相比,它的实际好处是什么 编辑:我从以下内容中获取了一些有用的花絮: 乔恩·斯凯特: 请注意,这不会以任何方式、形状或形式强制垃圾收集。垃圾收集和即时资源清理在某种程度上是正交的 Eddins是否会评论: 除非您的类实现IDisposable接口并具有Dispose()函数,否则您不会使用 第一个代码

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

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

我已经开始更多地使用
了,但我很好奇与作用域对象相比,它的实际好处是什么

编辑:我从以下内容中获取了一些有用的花絮:

乔恩·斯凯特:

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

Eddins是否会评论:


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


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

使用
结束时,对象被释放(放在括号内的对象必须实现IDisposable). 该对象在异常情况下也会被释放。您不必等待GC在某个时间执行它(您控制它)

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

  • 您不控制对象的处置
  • 即使在作用域的末尾调用dispose,它也不是异常安全的

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


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

使用
只需要实现IDisposable接口,并在作用域末尾调用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();
}

是这样的。

公平地说,这在需要清理类可能持有的非托管资源时最适用吗?或者它也适用于纯托管类吗?+1关于垃圾收集,我总是倾向于忘记它……IDisposable/using与“典型”与“重”对象无关。只要类有需要清除的非托管实例资源,或者当它有一个本身可IDisposable的托管实例字段时,它就应该实现IDisposable。该类可以只有一个字段,但如果该字段可IDisposable,则包含该字段的类也应可IDisposable。除非您的类实现了
IDisposable
接口,并且具有
Dispose()
函数,否则您不能使用。我想,如果你尝试的话,你应该会得到一个编译器错误。这基本上是一个try-finally块,它将保证对象在超出范围时被释放。@Sam:我将纠正这两个问题:“如果一个类只有一个
IDisposable
字段,并且它拥有该字段引用的对象,那么它本身应该是
IDisposable
”。所有权是这里的关键。
{
  FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate);
  fileStream.Dispose();
}