我注意到在分析我的程序时,很多 byte[] 卡在了内存中。我做了一些挖掘,发现大多数实例都是以这样的方式创建的:
public byte[] CreateBytes(byte[] bytes)
{
using (var start = new MemoryStream())
{
using (var memStr = new MemoryStream(bytes))
{
//do stuff
return start.ToArray();
}
}
}
返回的 byte[] 然后被传递给其他方法,并用于从另一个使用 block 中创建另一个 MemoryStream
:
using (var uncompressedStream = new MemoryStream(uncompressedData))
{
using (var compressedStream = new MemoryStream())
{
//Do some compression
}
}
myObject.Bytes = uncompressedData;
uncompressedData = null;
return myObject;
(uncompressedData
是从 CreateBytes() 返回的值)。
我的问题是,byte[] 何时被清理?我是否特别需要将其设置为 null,如果是,在哪里?在第二次 using block 之后我不再需要它,但是如果我简单地放置 uncompressedData = null;
我不确定这是否会回收内存。
我原以为 CreateBytes(byte[] bytes)
中的 using 语句会处理字节,但由于它返回一个引用,因此会推迟和/或放弃处理?
编辑:我添加了另一行代码。由于我将 uncompressedBtyes 存储在另一个对象中,将 uncompressedData 设置为 null 是没有意义的,并且 byte[] 将在 myObject
期间存在(或直到 myObject.Bytes
被设置为 null),正确吗?
最佳答案
当两个条件都满足时,byte[] 被清除:
- 没有对该内存块的引用
- 垃圾收集器决定收集那个内存块
基于多种因素,GC 在不确定的时间运行。
关于c# - 使用 block 从内部返回一次性对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12186319/