7
votes

Comment éviter les variables capturées?

J'ai un problème avec xxx

lorsque le dossage est exécuté, il reçoit la dernière valeur de chaque variable capturée au lieu de la valeur que je souhaite. Je peux imaginer une solution pour cela, mais cela imagine que vous pouvez trouver de meilleures solutions


2 commentaires

duplicache possible de Comment a Lambda en C # Bind to the Enumerator dans une foreach?


Je ne conviens pas que c'est un duplicata. Ce message demande pourquoi le comportement arrive; Cet article demande quelle est la meilleure façon d'écrire ce code pour éviter le problème.


4 Réponses :


14
votes

Le moyen canonique de résoudre est de copier les valeurs en variables temporaires déclarées à l'intérieur em> la boucle.

foreach(var category in categories)
{
    var catCopy = category;
    foreach(var word in words)
    {
        var wordCopy = word;
        var waitCallback = new WaitCallback(state =>
        {
            DoSomething(wordCopy, catCopy);
        });

        ThreadPool.QueueUserWorkItem(waitCallback);
    }
}


1 commentaires

Excellent, merci. Vous avez rayé la tête sur celle-ci pendant environ une heure. Donc, chaque boucle instancite d'une nouvelle variable locale, chacune d'elles qui est capturée indépendamment des autres - l'a eu.



1
votes

Pour référence, j'imagine que ce qui suit résoudrait mon problème: xxx


3 commentaires

Oui, vous pouvez également utiliser un tuple au lieu du keyvaluepair.


@Henk qui nécessite .net 4.0


Ce que je considère maintenant la valeur par défaut: sauf indication contraire.



1
votes

J'écrirais tout ce qui est comme celui-ci, qui esquit le problème et ne laisse absolument aucune question sur ce qui se passe: xxx


0 commentaires

4
votes

refacteur IT à: xxx

ceci est simple et facile à comprendre. Il indique la intention du développeur sans encombrer le code avec des variables supplémentaires (comme de la manière par défaut de résoudre ce problème).


1 commentaires

@MQuander: Peut-être une question de goût, mais c'est fondamentalement le même principe. Dans le cas de la fonction, la copie est faite implicitement via les paramètres de fonction.