关闭流,总是必要的? 。净

时间:2010-03-01 22:42:03

标签: c# stream

是否总是需要关闭流,或者因为.net是托管代码,它会在退出范围后自动关闭(假设没有异常引发)。

画报:

static string SerialiseObjectToBase64(object obj)
{
    var mstream = new MemoryStream();
    ...
    return Convert.ToBase64String(mstream.ToArray());        
}

以上代码是否可以接受?

4 个答案:

答案 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的对象总是一个好主意。