循环中的匿名 C# 委托 [重复]

问题描述 投票:0回答:3

大家好,我正在尝试写匿名委托。由于整数变量在代表之间共享,我需要它成为每个代表的本地实例,这样

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]);
    }));
}
c# delegates
3个回答
23
投票

制作

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]);
          }));
    }

闭包之美


6
投票

每次迭代使用本地获取不同的值

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

4
投票

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

如果您对为什么会发生这种情况感到好奇,这里有一个 MSDN 博客条目,其中包含详细的技术解释:Closing over the loop variable considered harmful

© www.soinside.com 2019 - 2024. All rights reserved.