|
|
1
1
免责声明 : 我不能保证这是100%的事实-你的问题很深,我可能会犯错误。 不过,我希望它能给你一些想法或方向。
让我们考虑这个问题
局部方法变量和方法参数存储在内存中的方法堆栈帧中(用
堆栈存储值类型和引用类型变量引用,这些引用指向堆中的对象。 方法执行时存在方法堆栈帧,方法结束后,局部方法变量将与堆栈帧一起显示。 除了以某种方式捕获局部变量外,它还与 编译程序 工作,你可以在乔恩·斯基特的网站上阅读: http://jonskeet.uk/csharp/csharp2/delegates.html#captured.variables
版本1
:
编译程序 按特定方式编译lambda,请阅读 实施例 完全段落: https://github.com/dotnet/csharplang/blob/master/spec/conversions.md#anonymous-function-conversions
版本4
:
我提供的两个链接将编译为
版本2 : 我不知道如何编译本地方法的细微差别,但应该与中的相同 版本4 (因此, 版本1 ) 版本3 : 所有的局部变量都将被有趣的方式捕获。
您还有“object x”,因此将创建编译器生成的类,该类
将包含公共字段
所以,我认为 1,2,4版本 内部相同: MyClass将包含将用作事件处理程序的方法。 在 版本3 将创建编译器生成的类,它将保存从lamdba转换的本地变量和方法。
任何类的任何实例都不会由GC收集,直到
|
|
|
SkyBlue · Java Spring服务的内存/垃圾收集器问题 2 年前 |
|
|
Guy_Hanan · 一个关于C++程序内存泄漏的问题 2 年前 |
|
|
yeerk · 在Python中跟踪特定对象的引用(内存泄漏) 2 年前 |
|
|
Priyanshu Sinha · Django内存泄漏/工人人数减少 3 年前 |
|
|
lHumanizado · Golang defer并不总是执行 3 年前 |