You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# Lambda表达式捕获外部变量:赋值3后fac值为何为2?

解答:Lambda捕获变量的执行顺序与引用特性

咱们一步步拆解这段代码的执行流程,就能明白为什么最终fac的值是2:

  1. 变量初始化:首先执行int fac = 1;,此时fac的初始值为1。
  2. Lambda定义(未执行):接着定义了Func<int, int> mul这个Lambda表达式。这里要注意:Lambda表达式在定义阶段不会执行内部代码,只是捕获了外部变量fac的引用——也就是说它和外部的fac是同一个变量,并非值副本。
  3. 更新变量值:执行fac = 3;,此时fac的值被更新为3。
  4. 调用Lambda:当执行mul(fac)时,发生了这几件事:
    • 首先把当前fac的值(3)作为参数n传入Lambda,但Lambda内部完全没用到n这个参数!
    • 然后Lambda内部执行fac = 2;,直接把捕获的fac变量的值改成了2。
    • 最后返回fac * fac,也就是2*2=4,所以第一个Console.WriteLine输出4。
  5. 输出最终变量值:第二个Console.WriteLine(fac)输出的是被Lambda修改后的fac,也就是2。

核心关键点:

  • Lambda捕获的是变量的引用,不是值拷贝,因此Lambda内部对fac的修改会直接影响外部的同名变量。
  • 这里传入Lambda的参数fac(值为3)没有任何实际作用,Lambda的逻辑只依赖它捕获的那个fac变量,和传入的参数无关。

内容的提问来源于stack exchange,提问作者Henrique Moreira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:33:22