似乎无法获取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,但我需要通过这个简单的测试才能完成...
答案 0 :(得分:5)
lambda表达式不使用任何捕获的变量,因此它被转换为静态方法。作为优化,为了防止由分配引起的额外GC开销,还创建了静态委托字段。执行赋值时,将访问此静态字段。每次都不会创建新的委托。一旦初始化,此静态委托将永远不会被收集。您可以通过查看decompilation。
来查看此内容