Potenzielle Fallstricke bei der Verwendung von Iterationsvariablen in Lambda-Ausdrücken
Im Bereich der Programmierung bieten Lambda-Ausdrücke eine prägnante Möglichkeit, anonyme Funktionen darzustellen. Allerdings kann die Verwendung von Iterationsvariablen in Lambda-Ausdrücken zu unerwarteten Ergebnissen führen.
Bedenken Sie den folgenden Code:
<code class="language-c#">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>
Dieser Code verknüpft versehentlich alle Lambda-Ausdrücke mit derselben Iterationsvariablen i
. Daher bezieht sich jeder Lambda-Ausdruck bei der Ausführung auf den Endwert von i
und nicht auf den erwarteten Wert von i
, als der Lambda erstellt wurde.
Infolgedessen ist die Ausgabe möglicherweise nicht wie erwartet. Anstatt wie erwartet 0 bis 9 zu drucken, gibt der Code zehnmal 10 aus. Es ist erwähnenswert, dass dieses Verhalten darauf zurückzuführen ist, dass alle beteiligten Delegierten eine einzelne Variable erfassen.
Um dieses unerwartete Ergebnis zu vermeiden, wird empfohlen, eine lokale Variable innerhalb der Schleife zu erstellen und ihr den Wert der Iterationsvariablen zuzuweisen. Auf diese Weise verweist jeder Lambda-Ausdruck auf eine andere lokale Variable und stellt so sicher, dass sie den erwarteten Wert beibehält. Der geänderte Code lautet wie folgt:
<code class="language-c#">List<Action> actions = new List<Action>(); for (int i = 0; i < 10; i++) { int temp = i; // 创建局部变量 actions.Add(() => Console.WriteLine(temp)); } foreach (Action action in actions) { action(); }</code>
Auf diese Weise erfasst jeder Lambda-Ausdruck eine unabhängige temp
Variable, wodurch das Problem des Überschreibens von Variablenwerten vermieden wird und die endgültige Ausgabe korrekt 0 bis 9 anzeigt.
Das obige ist der detaillierte Inhalt vonWarum erfassen Lambda-Ausdrücke den Endwert von Iterationsvariablen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!