探讨:StreamWriter的Close()方法可否代替Flush()和Dispose()?

fly263 2008-12-03 08:50:59
一般我们使用StreamWriter类时,先调用Flush()将数据写入文件,再调用Dispose()销毁流对象。StreamWriter还提供了Close()方法,MSDN中说“Close 的此实现调用传递 true 值的 Dispose 方法。必须调用 Close 以确保所有数据正确写出到基础流中。调用 Close 后,在 StreamWriter 上进行的任何操作都可能引发异常。如果磁盘上没有足够的空间,则调用 Close 将引发异常。除非显式地调用 Flush 或 Close,否则,刷新流不会刷新其基础编码器。”,而Dispose(bool disposing)方法中,disposing“为 true 则释放托管资源和非托管资源;为 false 则仅释放非托管资源。”,“当 disposing 参数为 true 时,此方法释放该 StreamWriter 引用的、由任何托管对象持有的全部资源。此方法调用每个引用对象的 Dispose 方法”,这样是不是可以使用Close()方法代替调用Flush()和Dispose()两个方法?
...全文
1701 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
arwind gao 2011-02-10
  • 打赏
  • 举报
回复 1
streamwriter.dispose()不会清理掉潜在的stream,除此之外close() and dispose()是完全一样的。
leochen315531813 2010-09-24
  • 打赏
  • 举报
回复
mark
changjiangzhibin 2008-12-15
  • 打赏
  • 举报
回复
推荐做法是
先Flush(),再Close(),这也是一般常用的
fly263 2008-12-15
  • 打赏
  • 举报
回复
还有其他见解吗?
qinhl99 2008-12-05
  • 打赏
  • 举报
回复
应该不可以吧,作用不完全一样啊
flyjimi 2008-12-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 blueterry 的回复:]
Close 可以代替flush
但是不能代替Dispose

因为streamWriter打开的不一定都是.net对象(Object)也有其他相关资源,比如系统资源等
如果不调用Dispose,这些资源将不能被及时释放,从而产生内存占用飞涨,甚至其他不可预见的问题
[/Quote]

StreamWriter.Close()会调用StreamWriter.Dispose (true), 而Dispose (true)会释放托管和非托管资源。

在我们的应用程序中,应该调用Close(),以代替直接调用Dispose()方法,Close做的工作中包含了Dispose()。
对于Stream这些类型,提供Close方法也更加自然。 (MSDN说对于有些类型,调用Close比Dispose更自然。)
另外,Close不能代替Flush。
通过Flush,你可以控制何时把缓冲区的数据刷到底层设备上。否则,只有缓冲区满的时候,以及Close的时候才会冲缓冲区。
blueterry 2008-12-05
  • 打赏
  • 举报
回复
Close 可以代替flush
但是不能代替Dispose

因为streamWriter打开的不一定都是.net对象(Object)也有其他相关资源,比如系统资源等
如果不调用Dispose,这些资源将不能被及时释放,从而产生内存占用飞涨,甚至其他不可预见的问题
whoami333 2008-12-05
  • 打赏
  • 举报
回复
Mark.

17,748

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧