C# Lambda表达式捕获外部变量:赋值3后fac值为何为2?
解答:Lambda捕获变量的执行顺序与引用特性
咱们一步步拆解这段代码的执行流程,就能明白为什么最终fac的值是2:
- 变量初始化:首先执行
int fac = 1;,此时fac的初始值为1。 - Lambda定义(未执行):接着定义了
Func<int, int> mul这个Lambda表达式。这里要注意:Lambda表达式在定义阶段不会执行内部代码,只是捕获了外部变量fac的引用——也就是说它和外部的fac是同一个变量,并非值副本。 - 更新变量值:执行
fac = 3;,此时fac的值被更新为3。 - 调用Lambda:当执行
mul(fac)时,发生了这几件事:- 首先把当前
fac的值(3)作为参数n传入Lambda,但Lambda内部完全没用到n这个参数! - 然后Lambda内部执行
fac = 2;,直接把捕获的fac变量的值改成了2。 - 最后返回
fac * fac,也就是2*2=4,所以第一个Console.WriteLine输出4。
- 首先把当前
- 输出最终变量值:第二个
Console.WriteLine(fac)输出的是被Lambda修改后的fac,也就是2。
核心关键点:
- Lambda捕获的是变量的引用,不是值拷贝,因此Lambda内部对
fac的修改会直接影响外部的同名变量。 - 这里传入Lambda的参数
fac(值为3)没有任何实际作用,Lambda的逻辑只依赖它捕获的那个fac变量,和传入的参数无关。
内容的提问来源于stack exchange,提问作者Henrique Moreira
相关产品推荐
相关产品推荐

