当前位置:  开发笔记 > 编程语言 > 正文

Lambda Expression导致弱引用的目标不能是GC吗?

如何解决《LambdaExpression导致弱引用的目标不能是GC吗?》经验,为你挑选了1个好方法。

它与lambdas无关.匿名委托可以观察到相同的行为.因此,如果您更改为代码

HandleMessage listener2 = delegate(string message) => { };

你得到相同的结果.

在第一种情况下,您在Test实例上有一个实例方法.由于在无效时没有对此实例的其他引用listener1,因此可能会收集它.

在第二种情况下,匿名方法必须放在某种类型上(因为方法本身不能存在).在这种情况下,编译器将匿名方法作为静态方法放在您的Test类上.此外,引用存储在Test类型的静态成员中.因此Type对该方法也有静态引用,这就是它在集合中存活的原因.

看一下IL,了解事情是如何连线的.



1> Brian Rasmus..:

它与lambdas无关.匿名委托可以观察到相同的行为.因此,如果您更改为代码

HandleMessage listener2 = delegate(string message) => { };

你得到相同的结果.

在第一种情况下,您在Test实例上有一个实例方法.由于在无效时没有对此实例的其他引用listener1,因此可能会收集它.

在第二种情况下,匿名方法必须放在某种类型上(因为方法本身不能存在).在这种情况下,编译器将匿名方法作为静态方法放在您的Test类上.此外,引用存储在Test类型的静态成员中.因此Type对该方法也有静态引用,这就是它在集合中存活的原因.

看一下IL,了解事情是如何连线的.

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有