C#委托和闭包实现方式

发布时间 2023-12-18 16:48:26作者: mc宇少

在底层,编译器会为委托生成一个类,这个类包含了每一个闭包所捕获的变量作为它的一个公有字段。这也是为什么闭包捕获的变量的生命周期和委托的一致的原因。

具体可以看: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#将所有被捕获的变量封到一个匿名类中(值类型装箱),构建实例并找个东西引用着(引用类型只要有人引用就不会被释放)。这个实例在闭包执行完毕后消除引用并回收。