static void Main(string[] args)
{
var s = 3;
Func<int, Func<int>> func =
x => () =>
{
return x;
};
var result1 = func(s);
func = null;
s = 5;
var result2 = result1();
Console.WriteLine(result2);
Console.ReadKey();
}
我的理解是 x 实际上并未声明为变量,例如。var x = 3。相反,它被传递给外部函数,该函数返回一个返回原始值的函数。在它返回 this 的时候,它会在 x 周围创建一个闭包来记住它的值。再后来,如果你改变 s,它就没有效果了。
这是正确的吗?
(顺便说一下,输出是 3,这是我所期望的)。
编辑:这是一个关于为什么我认为它的图表
x=3 被传递给 func,它返回一个简单地返回 x 的函数。但是 x 在内部函数中不存在,只有它的父级,并且在我将其设为 null 后,它的父级不再存在。当运行内部函数时,x 存储在哪里?它必须从父级创建一个闭包。
进一步澄清:
int s = 0;
Func<int, Func<int>> func =
x => () =>
{
return x;
};
for (s = 0; s < 5; s++)
{
var result1 = func(s);
var result2 = result1();
Console.WriteLine(result2);
};
输出为 0、1、2、3、4
但是,以您的示例为例:
static void Main(string[] args)
{
int s = 0;
Func<int, Func<int>> func =
x => () =>
{
return s;
};
List<Func<int>> results = new List<Func<int>>();
for (s = 0; s < 5; s++)
{
results.Add(func(s));
};
foreach (var b in results)
{
Console.WriteLine(b());
}
Console.ReadKey();
}
输出是 5 5 5 5 5,这不是你想要的。它没有捕获变量的值,它只是保留了对原始 s 的引用。
闭包是在 javascript 中创建的,正是为了避免这个问题。