C# 为什么这不是一个结束?
前几天我读了以下两篇博文: 这两篇文章的基本总结是,在C#和JavaScript中,关闭循环变量(而不是循环值)是一种语言特性,它令人困惑,并可能导致重大和令人费解的错误 考虑到这一点,我今天读了一些关于泛型使用的文章,我遇到了一些让我非常困惑的代码。代码如下:C# 为什么这不是一个结束?,c#,loops,generics,msdn,C#,Loops,Generics,Msdn,前几天我读了以下两篇博文: 这两篇文章的基本总结是,在C#和JavaScript中,关闭循环变量(而不是循环值)是一种语言特性,它令人困惑,并可能导致重大和令人费解的错误 考虑到这一点,我今天读了一些关于泛型使用的文章,我遇到了一些让我非常困惑的代码。代码如下: class TestGenericList { static void Main() { // int is the type argument GenericList<int&
class TestGenericList
{
static void Main()
{
// int is the type argument
GenericList<int> list = new GenericList<int>();
for (int x = 0; x < 10; x++)
{
list.AddHead(x);
}
foreach (int i in list)
{
System.Console.Write(i + " ");
}
}
}
类TestGenericList
{
静态void Main()
{
//int是类型参数
GenericList=新建GenericList();
对于(int x=0;x<10;x++)
{
列表。添加头(x);
}
foreach(列表中的int i)
{
System.Console.Write(i+“”);
}
}
}
此代码与链接的博客文章中的代码有一个表面上的相似之处。显然,该代码输出
{0,1,2,3,4,5,6,7,8,9}
,而不是{10,10,10,10,10,10}
。有人能给我解释一下为什么这段代码不是闭包吗?我的困惑和由此产生的问题主要与我不理解闭包这一事实有关
代码列表之间的唯一联系是for
循环,它在我的脑海中发出警报。然而,这根本不是一个结束,因此没有两篇博文中概述的陷阱。闭包是完全不同的事情,有不同的潜在问题
这就教给我们闭包的概念。因为代码中没有捕获变量?没有任何闭包。此外,如果循环变量被闭包,结果将是
{10,10,10,10,10,10}
而不是{9,9,9,9,9,9,9}
。这个问题不是离题的。许多初学者对标识变量的标识符何时生成变量或何时生成变量值感到困惑是有道理的。情况就是这样。当从中读取变量时,结果是它的值,因此AddHead(x)
将x
的当前值添加到列表中,而不是将变量x
的引用添加到列表中。关键是读取变量的lambda与读取变量的lambda不同。创建读取变量的lambda时,lambda在执行时读取变量的当前值,就像任何其他读取读取变量的当前值一样。创建lambda不会读取变量并将读取的值存储在某个地方。@LincolnBergeson:我的意思是,我认为它的措辞不太可能对未来的访问者有用(尤其是有点敌意的标题)。我想您可以编辑它以使其更有用,可能会显示两个示例循环,并询问为什么一个捕获变量,而另一个不捕获。