我在一些开源代码中发现了以下结构:
var mstream = new MemoryStream();
// ... write some data to mstream
mstream.Close();
byte[] b = mstream.GetBuffer();
我认为这段代码可能会出现“意外”行为,甚至会抛出异常,因为根据MSDN文档的说明,对
Close
方法的调用应该等同于对Dispose
方法的调用。然而,通过我的实验,我发现即使我使用
Thread.Sleep
让程序休眠20秒,或者通过GC.Collect()
强制进行垃圾回收,对GetBuffer()
方法的调用始终成功并返回有效结果。在
Close
/Dispose
后,GetBuffer()
方法是否应该成功?如果是这样,为什么MemoryStream
中的底层缓冲区没有被释放呢?
GetBuffer
将获取整个缓冲区,包括为增长而存在的任何填充。如果流没有使用固定容量初始化,这可能意味着您有不想要的末尾零。话虽如此,如果我正确阅读了代码,GetBuffer
仅在缓冲区大小固定时起作用。 - Luaan