【发布时间】:2017-06-12 09:31:59
【问题描述】:
为什么下面的代码会打印两次 11?
int i = 10;
Action fn1 = () => Console.WriteLine(i);
i = 11;
Action fn2 = () => Console.WriteLine(i);
fn1();
fn2();
输出 11 11
根据这篇文章中的答案 - How to tell a lambda function to capture a copy instead of a reference in C#? - 将一个 lambda 转换为一个带有捕获变量副本的类。如果是这种情况,我的示例不应该打印 10 和 11 吗?
现在,当 lambda 通过引用捕获时,它如何影响捕获的变量的生命周期。例如,假设上面的代码在一个函数中,并且 Actions 的作用域对于这样的变量是全局的:
class Test
{
Action _fn1;
Action _fn2;
void setActions()
{
int i = 10;
_fn1 = () => Console.WriteLine(i);
i = 11;
_fn2 = () => Console.WriteLine(i);
}
static void Main()
{
setActions();
_fn1();
_fn2();
}
}
在这种情况下,当调用操作时,我的变量不会超出范围吗?那么,这些操作是否带有悬空指针类型的引用?
【问题讨论】: