Parameterauswertung für anonyme Funktion erzwingen

  • Ich frage mich, ob es eine einfache Möglichkeit gibt, die Parameterauswertung für anonyme Funktionen zu erzwingen? Es ist von Bedeutung

    für die Multithread-Programmierung. Zum Beispiel, wenn ich schrieb

             for(int i=0; i<5; ++i)
            {
                Task.Factory.StartNew(() => Console.WriteLine(i));
            }
     

    Die meisten Leute würden fünfmal "5" bekommen. Es ist wahrscheinlicher, dass der Codeausschnitt 0 bis 5 ausgibt.

    Eine schnelle Lösung ist folgende:

             for(int i=0; i<5; ++i)
            {
                var local = i;
                Task.Factory.StartNew(() => Console.WriteLine(local));
            }
     

    Ich denke, das Leben ist besser, wenn die folgende Methode existiert, um alle Parameter für anonyme Funktionen auszuwerten und eine als Logik desselben Ursprungslogik zurückzugeben:

         Action EvaluateParameters(Action action)
     

    Irgendwelche Ideen?

    Danke.

    06 January 2012
    Rupesh Yadavmini
1 answer
  • Ich weiß nicht, ob eine solche Methode ohne Compiler- oder Framework-Unterstützung ((vernünftigerweise) möglich ist. Am Ende generiert der Compiler Code, um die Variable anzuheben, nicht ihren Wert zum Zeitpunkt der Erstellung des Delegaten, was zu diesem Verhalten führt.

    Im Prinzip müssten Sie den Delegierten in "EvaluteParameters" ausführen, damit er funktioniert. Oder das Ausprobieren mit Ausdrücken könnte das irgendwie tun.

    Übrigens, dies ist nur ein Problem, wenn der Delegat in der Schleife erstellt wird, aber aufgerufen wird außerhalb (danach).

    Oh, und ReSharper hat eine Warnung dafür (auch wenn es manchmal "falsch" oder übertrieben pedantisch ist).

    Wie auch immer, Jon Skeet erwähnt in seinem Buch (C # in Depth), dass dies tatsächlich Verwirrung in der Community gibt und dass Microsoft erwägt, möglicherweise das Verhalten in einer zukünftigen Version zu ändern ( hoffentlich habe ich das aus dem Gedächtnis etwas richtig gemacht). Was nicht einmal möglich ist, ohne den vorhandenen Code zu brechen, der vom aktuellen Verhalten abhängt (oder aufgrund dessen zufällig funktioniert).

    24 August 2011
    Christian.KNBS