我正在運行下面的代碼,結果在發佈模式下運行時完全不同。在調試模式下,它從不收集類A的對象,在Reaelse模式下,它立即收集類A的對象。GC.COllect()似乎無法在調試模式下工作
有人可以解釋爲什麼。
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
} }
這不是原因。這個參考文件並沒有被拋棄,它被認爲是不活躍的,並且這與最優化沒有任何關係。這是另一種方式;該變量可以在該點處於非活動狀態時進行優化。 – Guffa 2009-04-16 12:22:20
「推翻」可能有點太簡單了,因爲解釋,同意。不過,原因是正確的;在釋放模式下沒有強大的參考,阻止GC收集實例。 – Lucero 2009-04-16 12:30:41