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

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

图说:

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

以上代码是否可以接受?

使用MemoryStream它有点没有用处 – 因为你最终正在与一个托管byte[]交谈(所以它仍然会等待例行的垃圾收集)。 但总的来说 ,是的:你应该关闭(更好: Dispose()通过using ,所以它在exception时关闭)流完成后,否则你可能不会将一些数据刷新到底层(非托管)目的地。 并且有一些流实际上并没有完全“刷新” Flush() – 它们需要Close() d(特别是压缩流)。

关闭你的溪流是一种很好的做法。 使用using语句,当Dispose()超出范围(或抛出exception)时将调用Dispose() ),这将关闭您的流。

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

关闭流和处理对象是两回事。 关闭流刷新写入缓冲区并将任何未写入的数据写入流。 处理流将简单地释放流变量使用的内存。

.Net的GC非常……懒惰。 仅仅因为参考已经丢失并不意味着它立即被扫地,压碎并送到垃圾填埋场。 由于这个原因,关闭开放资源并处理实现IDisposable的对象总是一个好主意。