Das unerwartete Verhalten von Iterationsvariablen in Lambda-Ausdrücken verstehen
Ein Entwickler ist kürzlich auf eine Compiler-Warnung bezüglich der Verwendung von Schleifeniterationsvariablen in Lambda-Ausdrücken gestoßen. Dies verdeutlicht eine häufige Gefahr, die zu unerwartetem Programmverhalten führt. Lassen Sie uns untersuchen, warum dies geschieht.
Betrachten Sie dieses Codebeispiel:
<code class="language-csharp">List<Action> actions = new List<Action>(); for (int i = 0; i < 10; i++) { actions.Add(() => Console.WriteLine(i)); } foreach (Action action in actions) { action(); }</code>
Man könnte erwarten, dass dadurch die Zahlen 0 bis 9 nacheinander gedruckt werden. Stattdessen wird zehnmal „10“ gedruckt. Dies liegt daran, dass die Lambda-Ausdrücke nicht für jede Iteration eine Kopie von i
erfassen. Stattdessen erfassen sie einen Verweis auf die Variable i
. Wenn die foreach
-Schleife ausgeführt wird, ist die Schleife abgeschlossen und i
behält ihren Endwert von 10. Jeder Lambda-Ausdruck gibt daher diesen Endwert aus.
Dieses unerwartete Ergebnis unterstreicht, wie wichtig es ist, dieses Codierungsmuster zu vermeiden. Die Compiler-Warnung dient als entscheidende Schutzmaßnahme. Um die gewünschte sequentielle Ausgabe zu erreichen, erstellen Sie eine neue Variable innerhalb der Schleife und weisen Sie ihr den Wert der Iterationsvariablen zu:
<code class="language-csharp">List<Action> actions = new List<Action>(); for (int i = 0; i < 10; i++) { int j = i; // Capture a copy of i actions.Add(() => Console.WriteLine(j)); } foreach (Action action in actions) { action(); }</code>
Dieser überarbeitete Code gibt 0 bis 9 korrekt aus, da jeder Lambda-Ausdruck jetzt eine eindeutige, unabhängige Kopie des Werts erfasst j
. Diese einfache Änderung stellt das erwartete und konsistente Verhalten sicher.
Das obige ist der detaillierte Inhalt vonWarum führt die Verwendung von Iterationsvariablen in Lambda-Ausdrücken zu unerwarteten Ergebnissen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!