如果我遇到以下情况:
StreamWriter MySW = null;
try
{
Stream MyStream = new FileStream("asdf.txt");
MySW = new StreamWriter(MyStream);
MySW.Write("blah");
}
finally
{
if (MySW != null)
{
MySW.Flush();
MySW.Close();
MySW.Dispose();
}
}
我是否可以调用MySW.Dispose()
并跳过Close,即使它已提供?有没有一些流实现不能像预期的那样工作(比如CryptoStream)?
如果不是,那么下面就是糟糕的代码:
using (StreamWriter MySW = new StreamWriter(MyStream))
{
MySW.Write("Blah");
}
发布于 2009-05-26 15:57:27
我使用了反射器,发现System.IO.Stream.Dispose
看起来像这样:
public void Dispose()
{
this.Close();
}
发布于 2009-06-18 23:52:20
正如Daniel Bruckner提到的,Dispose和Close实际上是一回事。
但是,Stream在被释放/关闭时不会调用Flush()。FileStream (我假设任何其他具有缓存机制的流)在被释放时都会调用Flush()。
如果你在扩展Stream,或者MemoryStream等,你需要在disposed/closed的时候调用Flush(),如果有必要的话。
发布于 2009-05-26 16:36:13
所有标准流(FileStream、CryptoStream)将在关闭/释放时尝试刷新。我认为任何Microsoft流实现都可以依赖这一点。
因此,如果刷新失败,Close/Dispose可能会抛出异常。
事实上,FileStream的.NET 1.0实现中存在一个错误,如果刷新抛出异常,它将无法释放文件句柄。在.NET 1.1中,通过向Dispose(布尔值)方法添加try/finally块修复了此问题。
https://stackoverflow.com/questions/911408
复制相似问题