您的代码有什么问题?如果在关闭流之前发生异常,则流将保持打开状态,并且不会释放系统资源:
StreamWriter sr = new StreamWriter(streamFolder);
sr.Write(details);
// some exception occurs here
File.SetAttributes(streamFolder, FileAttributes.Hidden);
sr.Close();
因此,您需要确定该流将被关闭。这可以通过try...finally 块来实现:
StreamWriter sr = new StreamWriter(streamFolder);
try
{
sr.Write(details);
// some exception occurs here
File.SetAttributes(streamFolder, FileAttributes.Hidden);
}
finally
{
sr.Close();
}
但是 StreamWriter 实现了IDisposable 接口,所以你可以让 C# 编译器自动为你做这件事,方法是将 writer 的使用情况包装到 using 块中:
using(StreamWriter sr = new StreamWriter(streamFolder))
{
sr.Write(details);
// some exception occurs here
File.SetAttributes(streamFolder, FileAttributes.Hidden);
}
这段代码将被编译为:
StreamWriter sr = new StreamWriter(streamFolder);
try
{
sr.Write(details);
// some exception occurs here
File.SetAttributes(streamFolder, FileAttributes.Hidden);
}
finally
{
if (sr != null)
sr.Dispose();
}
手动实现的唯一区别是空检查和方法Dispose被调用而不是Close。但实际上当你调用Close() 或Dispose() 时会执行相同的代码:
this.Dispose(true);
GC.SuppressFinalize(this);
您可以在Dispose method implementation 上阅读更多内容。