循环中的匿名c#委托

时间:2009-11-18 16:10:51

标签: c# delegates

大家好我想写的和匿名代表。因为整数变量在委托之间共享,我需要它是每个委托的本地实例,这样rs [0]总是得到nics [0],rs [1]总是得到nics [1]等等...我能做到这一点。

for (int i = 0; i < nics.Count; i++)
   {
         rs[i] = new RollingSeries(monitor, new RollingSeries.NextValueDelegate(delegate()
         {
            return GetNetworkUtilization(nics[i]);
          }));
    }

Abdul khaliq

3 个答案:

答案 0 :(得分:22)

制作i的本地副本:

   for (int i = 0; i < nics.Count; i++)
   {
         int j = i;
         rs[i] = new RollingSeries(monitor, new RollingSeries.NextValueDelegate(delegate()
         {
            return GetNetworkUtilization(nics[j]);
          }));
    }

The Beauty of Closures

答案 1 :(得分:6)

使用local来获得每次迭代的不同值

for (int i = 0; i < nics.Count; i++)
   {
         int localI = i;
         rs[i] = new RollingSeries(monitor, new RollingSeries.NextValueDelegate(delegate()
         {
            return GetNetworkUtilization(nics[localI]);
          }));
    }

答案 2 :(得分:4)

int j = i放入循环中并引用lambda表达式中的j

如果您对发生这种情况的原因感到好奇,请参阅MSDN博客文章,其中包含详细的技术说明:Closing over the loop variable considered harmful