Les Closures C# avant le framework .Net 4.5 Partie2 (Une solution de contournement)

Workarround

Sur le 1er exemple

Au lieu de transmettre la variables ‘libre’ à l’expression lambda (ou fonction anonyme), on créer une copie locale de cette variable libre qu’on transmet au lambda.

De cette manière, la fermeture sera à chaque fois effectuée autour de la variable de copie qui a la valeur actuelle du compteur au moment de l’exécution.

Cette valeur de copie locale persisite, elle ne sera pas modifiée ultérieurement par la boucle.


private static Func<int, int> ReturnFunc()
{
    var localvariable = 1;

    Func<int, int> myfunc = delegate (int var1)
    {
        //copylocalvariable is used inside of the delegate 
        var copylocalvariable = localvariable;
        Console.WriteLine("Value of copylocalvariable: " + copylocalvariable);
        copylocalvariable += 1;
        return var1 * copylocalvariable;
    };

    //When we return the myfunc, copylocalvariable is bound 
    //inside of EACH delegate
    return myfunc;
}

Plus tard, lors des différents appels à ReturnFunc , chacun utilisera sa propre fermeture autour de la copie copylocalvariable et aura donc sa propre valeur attendue.

 Sortie

First call
Value of copylocalvariable: 1
Result: 4
Second call
Value of copylocalvariable: 1
Result: 8

Sur le 2nd exemple

var listAction = new List<Action>();

for (int i=0; i<10; i++)
{
    var j = i;
    listAction.Add(() => Console.WriteLine(j));
}

foreach(Action item in listAction)
{
    //When we return the item, j is bound 
    //inside of EACH delegate composing the loop
    item();
}

Sortie

0
1
2
3
4
5
6
7
8
9

Leave a Reply

Your email address will not be published. Required fields are marked *