在底层,编译器会为委托生成一个类,这个类包含了每一个闭包所捕获的变量作为它的一个公有字段。这也是为什么闭包捕获的变量的生命周期和委托的一致的原因。
具体可以看:https://blog.csdn.net/zhudaokuan/article/details/113032690
总的来说,C#中的委托和闭包的底层原理都与编译器如何处理这两种结构有关。编译器会为委托和闭包生成特殊的类和方法,以实现它们的功能
扩展:lua的闭包
lua闭包:https://www.cnblogs.com/mcyushao/p/17478562.html
lua闭包是直接在函数原型中建一个数组,存闭包(被捕获的变量)
如何保证闭包捕获的变量不会被释放?
1.lua在栈中建了一个容器用来存所有的闭包(让所有闭包都有引用,函数原型中的闭包数组存的是这个容器的key)。
2.c#将所有被捕获的变量封到一个匿名类中(值类型装箱),构建实例并找个东西引用着(引用类型只要有人引用就不会被释放)。这个实例在闭包执行完毕后消除引用并回收。
标签:闭包,变量,委托,C#,捕获,lua,编译器 From: https://www.cnblogs.com/mcyushao/p/17904111.html