前几天我读了以下两篇博文:
Eric Lippert, Closing over the loop variable considered harmful
这两篇文章的基本摘要是,关闭循环变量而不是循环值是C#和JavaScript中的一种语言特性,这种特性令人困惑,并且可能导致重大且令人费解的错误。
考虑到这一点,我今天正在阅读一些MSDN documentation关于泛型的使用,我遇到了一些令我困惑的代码。这是代码:
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 + " ");
}
}
}
此代码与链接博客帖子中的代码表面相似。显然,此代码会输出{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
而不是{10, 10, 10, 10, 10, 10, 10, 10, 10}
。任何人都可以向我解释为什么这段代码不是封闭的?
答案 0 :(得分:1)
我的困惑和由此产生的问题主要与我不理解闭包的事实有关。
代码清单之间唯一的连接是for
循环,它在我脑海中引发了警报。然而,这根本不是一个封闭,因此没有任何陷阱在两篇博文中列出。封闭是完全不同的,具有不同的潜在问题。
Here is a link教授闭包的概念。