Action <string>不是垃圾回收。为什么?

时间:2015-08-03 08:13:56

标签: c# garbage-collection

似乎无法获取GC收集的动作。为什么呢?

        WeakReference reference = null;
        WeakReference reference2 = null;

        new Action(() =>
        {
            Action<string> deliveryMessage = (ans) => { };
            object a = new object();

            reference = new WeakReference(deliveryMessage);
            reference2 = new WeakReference(a);
        }) ();

        GC.Collect();
        GC.WaitForPendingFinalizers();
        Assert.Null(reference2.Target);  //True
        Assert.Null(reference.Target);   //False

我将在WeakReference列表中使用Action,但我需要通过这个简单的测试才能完成...

1 个答案:

答案 0 :(得分:5)

lambda表达式不使用任何捕获的变量,因此它被转换为静态方法。作为优化,为了防止由分配引起的额外GC开销,还创建了静态委托字段。执行赋值时,将访问此静态字段。每次都不会创建新的委托。一旦初始化,此静态委托将永远不会被收集。您可以通过查看decompilation

来查看此内容