2009-11-18 3 views
11

Привет всем, я пытаюсь написать и анонимный делегат. поскольку целочисленная переменная делится между делегатом, мне нужно, чтобы это был локальный экземпляр каждого делегата, так что rs [0] всегда получает nics [0], rs [1] всегда получает nics [1] и т. д. ... как я получу это.Анонимный делегат C# в цикле

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

Абдул Халик

+5

Be * очень * осторожны, о чем вы просите. Вы хотите, чтобы ваше первое закрытие всегда получало значение в nics [0] * во время вызова делегата *, или вы хотите, чтобы закрытие получило значение, которое оказалось в nics [0] *, в то время, когда делегат был создан *? Это две разные вещи; nics [0] - переменная, поэтому ее значение может меняться со временем. Вы хотите, чтобы закрытие увидело это изменение или проигнорировало это изменение? –

ответ

20

сделать локальную копию 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

+0

Или локальная копия элемента в массиве. – Dykam

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 внутри вашей петли и обратитесь к j в выражении лямбда.

Если вы хотите знать, почему это происходит, вот запись в блоге MSDN, содержащий подробное техническое объяснение: Closing over the loop variable considered harmful

Смежные вопросы