C#闭包对垃圾收集器的奇怪影响

时间:2016-07-08 13:20:42

标签: c# .net garbage-collection weak-references

直接代码

False
True

我从这段代码得到的输出是

WeakEventManager

这究竟是怎么回事?

P.S。我试图找出+919986040933 00919986040933 +919986040933#12 +919986040933#123 +919986040933#1234 +919986040933#12345 的工作原理,然后进入了这个过程。

1 个答案:

答案 0 :(得分:6)

编译器会将_noClosure委托缓存在静态字段中,并在每次调用Init时重复使用它。每次都可以重复使用完全相同的实例。

将其与_closure进行比较,C()会在每次调用Init()时关闭_noClosure的新实例 - 无法缓存。

ildasm的缓存意味着代表有一个强引用(字段),因此无法进行垃圾回收。

如果您在应用程序上运行MERGE,则可以看到所有这些内容。