以下两段代码之间有什么区别:
using (Object o = new Object())
{
// Do something
}
和
{
Object o = new Object();
// Do something
}
我已经开始使用using
了很多,但我很好奇与范围对象相比实际上有什么好处。
编辑:我从中获取了有用的花絮:
Jon Skeet:
请注意,这不会以任何方式,形状或形式强制进行垃圾收集。垃圾收集和快速资源清理有点正交。
Eddins会发表评论:
除非您的类实现了IDisposable接口,并且具有Dispose()函数,否则不要使用。
答案 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在某个时间执行此操作(您可以控制它)。
编辑:范围界定的缺点是:
答案 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方法。
关于正确处理对象的大量争论,还有很多其他线程。