从使用块内返回一次性对象

Dev*_*vin 3 c# memory-leaks memory-management using .net-4.0

在分析我的程序时,我注意到很多字节[]卡在内存中.我做了一些挖掘,发现大多数实例都是以某种方式创建的:

public byte[] CreateBytes(byte[] bytes)
{
    using (var start = new MemoryStream()) 
    {
        using (var memStr = new MemoryStream(bytes))
        {
            //do stuff
            return start.ToArray();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

返回的byte []然后传递给其他方法,并用于MemoryStream从另一个使用块中创建另一个方法:

using (var uncompressedStream = new MemoryStream(uncompressedData))
{
    using (var compressedStream = new MemoryStream())
    {
        //Do some compression
    }
}

myObject.Bytes = uncompressedData;
uncompressedData = null;

return myObject;
Run Code Online (Sandbox Code Playgroud)

(uncompressedData是从CreateBytes()返回的值).

我的问题是,byte []什么时候被清除? 我是否特别需要将其设置为null,如果是,那么在哪里?在第二个使用块后我不再需要它,但如果我只是说uncompressedData = null;我不确定是否会回收内存.

我会认为use语句CreateBytes(byte[] bytes)会处理掉字节,但是因为它返回了一个引用会推迟和/或放弃处理吗?

编辑:我添加了另一行代码.因为我将uncompressedBtyes存储在另一个对象中,所以将uncompressedData设置为null是没有意义的,并且byte []只要myObject(或者直到myObject.Bytes设置为null)就会生存,对吗?

Eri*_* J. 5

当两个条件都满足时,byte []被清除:

  • 没有对该内存块的引用
  • 垃圾收集器决定收集该内存块

GC基于各种因素在非确定性时间运行.