我正在运行下面的代码,当它在 Release 模式下运行时,结果完全不同。在 Debug 模式下,它从不收集 A 类的对象,而在 Reaelse 模式下,它立即收集 A 类的对象。
有人可以解释为什么。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2 {
class Program
{
static void Main(string[] args)
{
A obj = new A();
B bobj = obj.objB;
GC.Collect();
GC.WaitForPendingFinalizers();
while (bobj.isLive)
{
Console.WriteLine("Is Alive!!");
}
Console.WriteLine("Is Dead!!");
Console.ReadLine();
}
}
class A:IDisposable
{
public B objB = new B();
public A()
{ }
~A()
{
objB.Dispose();
}
#region IDisposable Members
public void Dispose()
{
GC.SuppressFinalize(this);
}
#endregion
}
class B:IDisposable
{
public bool isLive = true;
#region IDisposable Members
public void Dispose()
{
this.isLive = false;
GC.SuppressFinalize(this);
}
#endregion
} }
最佳答案
在 Debug模式下,编译器不会优化局部变量。因此,对 A 的引用仍然存在。在Release 模式下,编译器优化了用法,以便丢弃引用并收集对象。
关于.net - GC.COllect() 似乎在 Debug模式下不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/755680/