是否总是需要关闭流,或者因为.net是托管代码,它会在退出范围后自动关闭(假设没有异常引发)。
画报:
static string SerialiseObjectToBase64(object obj)
{
var mstream = new MemoryStream();
...
return Convert.ToBase64String(mstream.ToArray());
}
以上代码是否可以接受?
答案 0 :(得分:12)
使用MemoryStream
这有点没有实际意义 - 因为你最终正在与托管byte[]
交谈(所以它仍然会等待例行的垃圾收集)。但是在 general 中,是的:你应该关闭(更好:Dispose()
通过using
,因此它会在异常时关闭)流完成后,否则你可能不会冲洗一些数据到底层(非托管)目的地。并且有些流在Flush()
上实际上并未完全“刷新” - 它们需要为Close()
d(特别是压缩流)。
答案 1 :(得分:9)
关闭你的溪流是一种好习惯。使用using
语句,当Dispose()
超出范围(或者抛出异常)时,将调用static string SerialiseObjectToBase64(object obj)
{
using (var mstream = new MemoryStream())
{
...
return Convert.ToBase64String(mstream.ToArray());
}
}
,这将关闭您的流。
{{1}}
答案 2 :(得分:4)
关闭流和处理对象是两回事。关闭流刷新写缓冲区并将任何未写入的数据写入流。处理流将简单地释放流变量使用的内存。
答案 3 :(得分:3)
.Net的GC非常......懒惰。仅仅因为参考已经丢失并不意味着它立即被扫地,压碎并送到垃圾填埋场。由于这个原因,关闭开放资源并处理实现IDisposable的对象总是一个好主意。