在C#中关闭循环变量

use*_*041 6 .net c# foreach syntactic-sugar

这篇文章中,我被告知下面的代码部分遭受了"关闭循环变量的令人震惊的行为".

    foreach (Canidate canidate in allCanidates)
    {
        Thread newThread = new Thread(delegate()
        {
            BusyWait(canidate);
        });

        newThread.Start();
    }
Run Code Online (Sandbox Code Playgroud)

我把它换成了这个:

foreach (Canidate canidate in allCanidates)
        {
            var can = canidate;
            Thread newThread = new Thread(delegate()
            {                 
                BusyWait(can);
            });

            newThread.Start();
        }
Run Code Online (Sandbox Code Playgroud)

但我的老板一直坚持认为它会遭遇同样的问题.我使用链接尝试解决此问题.有人可以帮我正确解决问题,以便我的代码能够正确执行.这个问题对我来说都是新的,我不确定我是否完全理解它.

Joa*_*son 4

导致问题的原因是关闭稍后更改值的变量。

  • candidate改变循环中的每一“圈”都会导致问题。
  • can是在循环的每个“圈”中新创建的,永远不会改变,也不会引起问题。