如果我使用以下内容,它会花费更少的资源,清理会更快吗?
using (TextReader readLogs = File.OpenText("C:\\FlashAuto\\Temp\\log.txt"))
{
//my stuff
}
与:相比:
TextReader readLogs = new StreamReader("C:\\FlashAuto\\Temp\\log.txt");
//my stuff
readLogs.Close();
readLogs.Dispose();
答案 0 :(得分:25)
这些示例之间的区别不在于性能,而在于异常安全性。 using
在后台创建了一个try...finally
块。
表格的使用声明:
using (ResourceType resource = expression) embedded-statement
对应于扩展:
{ ResourceType resource = expression; try { embedded-statement } finally { // Dispose of resource } }
对于参考类型,处理通过以下方式进行:
finally { if (resource != null) ((System.IDisposable)resource).Dispose(); }
来自ECMA-344 C#语言规范第4版
您也无需同时拨打Close
和Dispose
。这些功能是等效的。
答案 1 :(得分:7)
第一个样本是简写的:
TextReader readLogs = File.OpenText("C:\\FlashAuto\\Temp\\log.txt");
try
{
// My stuff
}
finally
{
if (readLogs != null)
{
((IDisposable)readLogs).Dispose();
}
}
它的速度并不快,即使发生了一个在第二个例子中不会发生的异常,它也会被清除readLogs
。
有关详细信息,请参阅using Statement (C# Reference)。
无需同时调用Close
和Dispose
,Close
方法在内部执行与Dispose
方法相同的工作(由于使用了开发人员,因此重新命名有一个名为Close
)的方法。
更新:调用File.OpenText
和new StreamReader
之间也没有区别 - 内部File.OpenText
只是创建并返回StreamReader
的新实例