Heim >Backend-Entwicklung >C++ >Warum führt die Verwendung von Iterationsvariablen in Lambda-Ausdrücken zu unerwarteten Ergebnissen?

Warum führt die Verwendung von Iterationsvariablen in Lambda-Ausdrücken zu unerwarteten Ergebnissen?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-14 07:51:50488Durchsuche

Why Does Using Iteration Variables in Lambda Expressions Lead to Unexpected Results?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn