2009-11-18 9 views
11

Hallo alles, ich versuche zu schreiben und anonymen Delegierten. Da die Integer-Variable unter dem Delegaten geteilt wird, muss sie die lokale Instanz jedes Delegaten sein, so dass rs [0] immer nics [0] erhält, rs [1] immer nics [1] und so weiter ... wie werde ich das erreichen.Anonym C# Delegate innerhalb einer Schleife

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

Abdul Khaliq

+5

extrem * * vorsichtig, was für Sie fragen. Möchtest du, dass deine erste Closure immer den Wert in nics [0] * zum Zeitpunkt des Aufrufs der Delegate * erhält, oder möchtest du, dass die Closure den Wert erhält, der in Nics [0] * war, als die Delegat wurde erstellt *? Das sind zwei verschiedene Dinge; nics [0] ist eine Variable, daher kann sich ihr Wert im Laufe der Zeit ändern. Möchten Sie, dass die Schließung diese Veränderung sieht oder diese Änderung ignoriert? –

Antwort

20

Erstellen Sie eine lokale Kopie 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

Oder eine lokale Kopie des Elements im Array. – Dykam

6

Verwenden Sie einen lokalen, einen anderen Wert pro Iteration erhalten

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

Setzen Sie int j = i in Ihre Schleife und beziehen Sie sich innerhalb des Lambda-Ausdrucks auf j.

Wenn Sie neugierig sind, warum dies geschieht, ist hier ein MSDN-Blog-Eintrag eine detaillierte technische Erklärung enthält: Closing over the loop variable considered harmful