以下是一个演示问题的控制台应用程序:
输出为“False True True”。 我使用了SOS.dll来尝试找出阻止委托被垃圾回收的原因,以下是Action的结果:
有人能解释一下发生了什么吗?
class Program
{
static void Main()
{
InitRefs();
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(_refObj.IsAlive);
Console.WriteLine(_refAction.IsAlive);
Console.WriteLine(_refEvent.IsAlive);
Console.ReadKey();
}
private static void InitRefs()
{
_refObj = new WeakReference(new object());
_refAction = new WeakReference((Action) (() => { }));
_refEvent = new WeakReference(new EventHandler((sender, eventArgs) => { }));
}
private static WeakReference _refObj;
private static WeakReference _refAction;
private static WeakReference _refEvent;
}
输出为“False True True”。 我使用了SOS.dll来尝试找出阻止委托被垃圾回收的原因,以下是Action的结果:
!gcroot 02472584
HandleTable:
006613ec (pinned handle)
-> 03473390 System.Object[]
-> 02472584 System.Action
有人能解释一下发生了什么吗?