Permettez-moi de m'excuser à l'avance - je suis probablement le dépeçage de la terminologie. J'ai une vague idée de ce qu'est une fermeture, mais ne peut pas expliquer le comportement que je vois. Au moins, je pense que c'est un problème la fermeture. J'ai cherché en ligne, mais je n'ai pas trouvé les bons mots-clés pour obtenir ce que je veux.
Plus précisément - j'ai deux blocs de code sont VRAIMENT SIMILAIRES (au moins à mes yeux). D'abord:
static void Main(string[] args)
{
Action x1 = GetWorker(0);
Action x2 = GetWorker(1);
}
static Action GetWorker(int k)
{
int count = 0;
// Each Action delegate has it's own 'captured' count variable
return k == 0 ? (Action)(() => Console.WriteLine("Working 1 - {0}",count++))
: (Action)(() => Console.WriteLine("Working 2 - {0}",count++));
}
Si vous exécutez ce code et invoquer x1() et x2() vous verrez qu'ils maintiennent un distinct "comte" de la valeur.
foreach(var i in Enumerable.Range(0,4))
{
x1(); x2();
}
Sorties:
Working 1 - 0
Working 2 - 0
Working 1 - 1
Working 2 - 1
Working 1 - 2
Working 2 - 2
Working 1 - 3
Working 2 - 3
Qui fait sens pour moi et les matchs les explications que j'ai lu. Les coulisses d'une classe est créée pour chaque délégué/action et la classe est un champ pour stocker la valeur de "compter". Je suis allé au lit sentiment smart!
MAIS PUIS - je essayé ce très semblable code:
// x3 and x4 *share* the same 'captured' count variable
Action x3 = () => Console.WriteLine("Working 3 - {0}", count++);
Action x4 = () => Console.WriteLine("Working 4 - {0}", count++);
Et, comme le commentaire dit), le comportement est complètement différent ici. x3() et x4() semblent avoir la MÊME valeur du nombre de!
Working 3 - 0
Working 4 - 1
Working 3 - 2
Working 4 - 3
Working 3 - 4
Working 4 - 5
Working 3 - 6
Working 4 - 7
Je peux voir ce qui se passe, mais je ne suis pas vraiment pourquoi ils sont traités différemment. Dans ma tête - j'ai aimé que l'origine du comportement, j'ai été voir, mais ce dernier exemple me confond. J'espère qu'un sens. Merci