首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Stream.Dispose总是调用Stream.Close (和Stream.Flush)吗

Stream.Dispose总是调用Stream.Close (和Stream.Flush)吗
EN

Stack Overflow用户
提问于 2009-05-26 15:51:31
回答 7查看 42.9K关注 0票数 65

如果我遇到以下情况:

代码语言:javascript
复制
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)?

如果不是,那么下面就是糟糕的代码:

代码语言:javascript
复制
using (StreamWriter MySW = new StreamWriter(MyStream))
{
   MySW.Write("Blah");
}
EN

回答 7

Stack Overflow用户

发布于 2009-05-26 15:57:27

我使用了反射器,发现System.IO.Stream.Dispose看起来像这样:

代码语言:javascript
复制
public void Dispose()
{
    this.Close();
}
票数 59
EN

Stack Overflow用户

发布于 2009-06-18 23:52:20

正如Daniel Bruckner提到的,Dispose和Close实际上是一回事。

但是,Stream在被释放/关闭时不会调用Flush()。FileStream (我假设任何其他具有缓存机制的流)在被释放时都会调用Flush()。

如果你在扩展Stream,或者MemoryStream等,你需要在disposed/closed的时候调用Flush(),如果有必要的话。

票数 22
EN

Stack Overflow用户

发布于 2009-05-26 16:36:13

所有标准流(FileStream、CryptoStream)将在关闭/释放时尝试刷新。我认为任何Microsoft流实现都可以依赖这一点。

因此,如果刷新失败,Close/Dispose可能会抛出异常。

事实上,FileStream的.NET 1.0实现中存在一个错误,如果刷新抛出异常,它将无法释放文件句柄。在.NET 1.1中,通过向Dispose(布尔值)方法添加try/finally块修复了此问题。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/911408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档