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

Kel*_*sey 7 c# scope using

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

using (Object o = new Object())
{
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

{
    Object o = new Object();
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jon Skeet:

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

埃德斯会评论:

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

Jon*_*eet 20

第一个片段Dispose在块的末尾调用- 您只能使用实现的类型来执行IDisposable它,它基本上调用Disposefinally块,因此您可以将它与需要清理资源的类型一起使用,例如

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

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

基本上,你应该使用一个using语句来实现几乎任何实现IDisposable的代码以及你的代码块将负责的事情(就清理而言).

  • IDisposable/using与"典型"vs"重"对象无关.一个类应该实现IDisposable,只要它具有需要清除的非托管实例资源,或者当它具有本身是IDisposable的托管实例字段时.该类可以只有一个字段,但如果该字段是IDisposable,那么包含该字段的类也应该是IDisposable. (3认同)
  • 除非你的类实现`IDisposable`接口,并且有一个`Dispose()`函数,否则不要使用.如果你想的话,你应该得到一个编译器错误.这基本上是一个try-finally块,可以保证你的对象在超出范围时被处理掉. (3认同)