作者tomex (Tomex Ou)
看板C_Sharp
标题[问题] MemorySteam下的byte[]阵列存活期?
时间Thu Oct 27 13:16:24 2011
每当一些Stream或XML交换时,我特别喜欢用MemoryStream
若有需要转成byte[]阵列,就会用GetBuffer()直接操作这底下的阵列
也可以使用ToArray()来复制新的阵列。
直觉下使用GetBuffer()的阵列会比较不需耗效能copy
但就是怕其存活期会在stream.Close()後消失
我作了一个实验:
System.IO.MemoryStream ms = new System.IO.MemoryStream(3); // Capacity=3
byte[] bb1 = {1, 2, 3, 4}; // Make it over ms capacity.
ms.Write(bb1, 0, bb1.Length); // Capacity=256 by system allocated.
byte[] bb2 = ms.ToArray(); // bb2.Length=4, copy items.
byte[] bb3 = ms.GetBuffer(); // bb3.Length=256, as capacity but not copy
items (faster).
ms.Close();
GC.Collect(0);
GC.Collect(1);
GC.Collect(2);
byte[] bb4 = ms.ToArray(); // Still work.
byte[] bb5 = ms.GetBuffer(); // Still work.
ms.Dispose();
GC.Collect(0);
GC.Collect(1);
GC.Collect(2);
byte[] bb6 = ms.ToArray(); // Still work, what the hell dispose?
byte[] bb7 = ms.GetBuffer(); // Still work, what the hell dispose?
看来都能存活~ 但真的存活期是这样吗?
若要输出byte[]时,您觉得用那一个函式比较好呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
※ 编辑: tomex 来自: 111.250.105.59 (10/27 13:26)
1F:→ tomex:後来我使用ToArray()保险些,长度不用小心,资料量<1K 10/27 13:36
2F:→ justinlcs:MemoryStream并没有包含任何unmanaged资源。 10/27 20:34
3F:→ justinlcs:换言之并没有东西需要特别Dispose或Close 10/27 20:35
4F:→ justinlcs:GC会自动处里MemoryStream的生命周期,在不需要时清除 10/27 20:38
5F:→ justinlcs:只是刚好继承了Stream,有这些方法而已 10/27 20:39
6F:→ tomex:thx 10/28 02:10