C# 行动<;字符串>;没有垃圾收集。为什么?

C# 行动<;字符串>;没有垃圾收集。为什么?,c#,garbage-collection,C#,Garbage Collection,似乎无法获取GC收集的操作。为什么? WeakReference reference = null; WeakReference reference2 = null; new Action(() => { Action<string> deliveryMessage = (ans) => { }; object a = new object();

似乎无法获取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 reference=null;
WeakReference reference2=null;
新操作(()=>
{
Action deliveryMessage=(ans)=>{};
对象a=新对象();
参考=新的WeakReference(deliveryMessage);
参考2=新的WeakReference(a);
}) ();
GC.Collect();
GC.WaitForPendingFinalizers();
Assert.Null(reference2.Target)//符合事实的
Assert.Null(reference.Target)//错误的

我将在WeakReference列表中使用Action,但我需要先通过这个简单的测试…

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

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

谢谢!添加
Action deliveryMessage=TestMethod修复了我的问题。谢谢!添加
Action deliveryMessage=TestMethod修复了我的问题。