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

max*_*axp 17 c# stream

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

图说:

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

以上代码是否可以接受?

Mar*_*ell 12

随着MemoryStream这是一个有点一个有争议的问题的-因为你最终跟一个有管理的byte[](所以还是要等待常规垃圾收集).但总的来说,是的:你应该关闭(更好:Dispose()通过using,因此它会在异常时关闭)流完成后,否则你可能不会将一些数据刷新到底层(非托管)目的地.并且有些流实际上并不完全"刷新" Flush()- 它们需要Close()d(特别是压缩流).


Gre*_*reg 9

关闭你的溪流是一种很好的做法.使用该using语句,Dispose()当它超出范围时(或者抛出异常)将被调用,这将关闭您的流.

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