为何C#闭包采用类实现而非访问父方法栈帧?
C#闭包实现的设计疑问
- C#实现闭包的方式:将父方法的局部变量捕获到包含lambda/匿名方法的类中,以此实现对这些变量的访问。
- Pascal采用的另一种闭包实现方案:将父方法(实际是所有父方法)的栈帧地址传递给嵌套/匿名函数。这种方案性能上通常更高效——无需内存分配,不会给GC带来负载,且依托栈的原生局部性,具备更强的缓存友好性。
微软已意识到闭包的性能影响,因此推出了static anonymous functions特性。
核心问题:C#/CLR设计者为何选择用类捕获局部变量的方案,而非直接传递父方法的栈帧?毕竟访问父方法栈帧并非不可行,ref参数就是明确的可行案例。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

