C# 关闭流,总是必要的吗。网

C# 关闭流,总是必要的吗。网,c#,stream,C#,Stream,总是需要关闭流吗?或者,由于.net是托管代码,它会在退出作用域时自动关闭(假设没有引发异常) 插图: static string SerialiseObjectToBase64(object obj) { var mstream = new MemoryStream(); ... return Convert.ToBase64String(mstream.ToArray()); } 上述代码可以接受吗?关闭流是一种良好的做法。使用using语句,当它超

总是需要关闭流吗?或者,由于.net是托管代码,它会在退出作用域时自动关闭(假设没有引发异常)

插图:

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

上述代码可以接受吗?

关闭流是一种良好的做法。使用
using
语句,当它超出范围(或者抛出异常)时,将调用
Dispose()
,这将关闭流

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

对于
MemoryStream
,这是一个有点无意义的问题——因为您最终要与托管的
字节[]
(因此它仍将等待例行垃圾收集)。但一般来说,是的:您应该在完成时关闭流(更好的方法是:使用通过
关闭
Dispose()
,这样它会在异常情况下关闭),否则您可能无法将一些数据刷新到基础(非托管)目标。还有一些流实际上没有在
flush()
上完全“刷新”-它们需要
Close()
d(特别是压缩流)。

.Net的GC非常。。。懒惰。仅仅因为参考资料丢失了,并不意味着它会立即被清扫、压碎并送往垃圾填埋场。关闭打开的资源并处置实现IDisposable的对象始终是一个好主意。

关闭流和处置对象是两件不同的事情。关闭流将刷新写入缓冲区并将任何未写入的数据写入流。处理流只会释放流变量使用的内存

@Greg-当终结器运行时,它肯定会自动关闭。但是,无法保证何时关闭它(可能只是在流程退出时关闭)——因此,正如您所指出的,使用“using”始终是一个好主意。这是不正确的。处理一条流将关闭并冲洗它。。。但它不会释放任何内存。