题
下面两段代码有什么区别:
using (Object o = new Object())
{
// Do something
}
和
{
Object o = new Object();
// Do something
}
我已经开始使用 using
更多,但我很好奇与范围对象相比,实际的好处是什么。
编辑: 我从中得到的有用花絮:
乔恩·斯基特:
请注意,这不会强制以任何方式、形式或形式进行垃圾收集。垃圾收集和及时资源清理在某种程度上是正交的。
威尔·埃丁斯评论:
除非您的类实现了 IDisposable 接口,并且具有 Dispose() 函数,否则您不要使用 using。
解决方案
在第一个片段在块的末尾呼吁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
和你的代码块是要承担责任(在清理方面)。
其他提示
在......的最后 using
对象被释放(放在括号内的对象必须实现 IDisposable)。在异常情况下该对象也会被释放。而且你不必等待GC在某个时间来做这件事(你可以控制它)。
编辑:范围界定的缺点是:
- 您无法控制对象的处置
- 即使您在范围末尾调用 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();
}
是因为它是。
请参阅关于文档 IDisposable的和可确定的资源解除分配。
简单地说,在using{}
块的末尾,可以可靠地处置分配的资源(例如靠近文件句柄,数据库连接等)
using
只是需要IDisposable接口的实现,并调用在范围的端部的Dispose方法。
有关大量汹涌约正确处理对象的参数的,有大量的其他线程。
不隶属于 StackOverflow