2009-11-18 9 views
11

Salut tout ce que j'essaie d'écrire et délégué anonyme. comme la variable entière est partagée par le délégué, j'ai besoin que ce soit l'instance locale de chaque délégué, de sorte que rs [0] obtient toujours nics [0], rs [1] obtient toujours nics [1] et ainsi de suite ... vais-je y parvenir.Anonyme C# délégué dans une boucle

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

Abdul Khaliq

+5

* Soyez très * attention à ce que vous demandez. Voulez-vous que votre première fermeture obtienne toujours la valeur nics [0] * au moment où le délégué est appelé *, ou voulez-vous que la fermeture obtienne la valeur qui se trouve être dans nics [0] * au moment où le délégué a été créé *? Ce sont deux choses différentes; nics [0] est une variable, donc sa valeur peut changer avec le temps. Voulez-vous que la fermeture voit ce changement, ou ignorez-vous ce changement? –

Répondre

20

Faire une copie locale de 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

Ou une copie locale de l'élément dans le tableau. – Dykam

6

Utilisez un local pour obtenir une valeur différente par itération

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

Mettez int j = i dans votre boucle et référez-vous à j dans l'expression lambda.

Si vous êtes curieux de savoir pourquoi cela se produit, voici une entrée de blog MSDN contenant une explication technique détaillée: Closing over the loop variable considered harmful

Questions connexes