为什么这不是封闭?

时间:2014-06-13 14:55:56

标签: c# loops generics msdn

前几天我读了以下两篇博文:

Raymond Chen, Closing over the loop variable is just as harmful in JavaScript as it is in C#, and more cumbersome to fix

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}。任何人都可以向我解释为什么这段代码不是封闭的?

1 个答案:

答案 0 :(得分:1)

我的困惑和由此产生的问题主要与我不理解闭包的事实有关。

代码清单之间唯一的连接是for循环,它在我脑海中引发了警报。然而,这根本不是一个封闭,因此没有任何陷阱在两篇博文中列出。封闭是完全不同的,具有不同的潜在问题。

Here is a link教授闭包的概念。