我读过这篇文章:http://blogs.msdn.com/b/oldnewthing/archive/2010/08/10/10048149.aspx,老实说,我不了解每一个细节.据我所知,在下面的代码中,即使我没有将c设置为null,也应该收集c.另一件事是,只要我们处于相同功能的范围内,在foreach期间发生的分配似乎不会被释放.(见下面的例子)
class Program
{
public class SomeClass
{
public byte[] X;
public SomeClass()
{
X = new byte[1024 * 1024 * 100];
X[155] = 10;
}
}
static void Main()
{
Console.WriteLine("Memory: " + GC.GetTotalMemory(false));
SomeClass c;
c = new SomeClass();
Console.WriteLine("Memory: " + GC.GetTotalMemory(false));
GC.Collect();
Console.WriteLine("Memory: " + GC.GetTotalMemory(true));
Console.ReadKey();
/*
* Output:
*
* Memory: 186836
* Memory: 105044468
* Memory: 104963676
*
*/
}
}
Run Code Online (Sandbox Code Playgroud)
编辑第一个示例的解决方案:调试模式(不在调试器中运行,但甚至在编译模式下运行).如果我使用Release它将按预期工作:即使没有设置为null也会收集c.对于第二个例子,同样适用.
第二个例子
static void Main(string[] args)
{ …Run Code Online (Sandbox Code Playgroud)