[英]What is loop variable closure?
进行一个简单的foreach
循环:
foreach(var i in Enumerable.Range(1,10))
{
Console.WriteLine(i);
}
在 C#5 之前 ,只有一个变量i
用于循环的整个运行(每次迭代)。
在引入C#5之后,此循环现在将具有10个独立的i
变量...循环的每次迭代都有一个不同的变量。 这些变量的生存期较短,并且都具有相同的名称,但是它们仍然是唯一变量。 1个
乍一看,差异似乎并不重要,但是当您使用闭包时,较旧的行为可能会产生意想不到的结果。
您可以通过以下代码示例看到不同之处:
var results = new List<Func<int>>();
foreach(var i in Enumerable.Range(1,10))
{
results.Add(() => i);
}
foreach(var item in results)
{
Console.WriteLine(item());
}
该代码将在VS 2010和VS 2012(及更高版本)中编译并运行,但是根据您使用的代码,将给出不同的结果。
一个closure
是当编译器“关闭了”或“笼”变出来的是正常范围区域,延长它的寿命会发生什么。 每当使用lambda表达式(由=>
运算符表示)时,通常也会涉及到闭包。 在我的示例中,变量i
在闭包中使用,可用于列表中的匿名函数。
重要的是要了解变量和值之间的区别。 如果您可以在VS2010中运行代码,那么在只有一个变量的情况下,区别就很明显了……循环的早期迭代中的变量值可以继续被循环的后续迭代修改,然后再执行功能被调用,因此代码将输出所有10
s。 VS2012和更高版本的用户将变量分开,因此将按顺序输出1
到10
。
1在有人问之前:没有性能差异。 区别在于编译器抽象细节可能会影响性能,但通常不会以任何可衡量的方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.