这段的输出结果是0/1/2. 也就是说i的值不断增加,但是我们知道, GetDelegate这个方法下的i这个值, 它是一个临时变量, 方法执行结束就应该销毁了,怎么会增加到2?
原理就是编译器检测到, 委托使用的变量i, 使用过程超出了其作用域, 就自动产生了一个闭包,具体而言就是生成了一个新的类.
把以上代码输进SharpLab, 看看编译器拿到的版本,
为了方便阅读,我已经用GPT转化成正常C#语言(等效代码):(调用的类没有变,不用看)
可看到, 编译器生成了一个内部类, 把临时变量转换为成员变量, 这这就是编译器生成的"闭包". 可以猜测Func委托内部维持了对counterClosure这个变量的引用, 所以只要委托存在,这个变量就不会被回收.
至于闭包陷阱, 是因为闭包原理而产生的反常识现象, 下次再说~