Heim >Backend-Entwicklung >C++ >Warum erfassen Lambda-Ausdrücke den Endwert von Iterationsvariablen und wie kann dies vermieden werden?
Lambda-Ausdrücke bieten eine übersichtliche Möglichkeit, Inline-Funktionen in Schleifen zu definieren. Die direkte Verwendung von Iterationsvariablen in Lambdas kann jedoch später zu unerwartetem Verhalten führen.
Lambda-Falle iterierender Variablen:
Bedenken Sie den folgenden Code:
<code class="language-c#">for (int i = 0; i < 10; i++) { Action action = () => Console.WriteLine(i); actions.Add(action); } foreach (var action in actions) { action(); }</code>
Man könnte meinen, dass jedes Lambda den entsprechenden Wert von i ausgibt. Aufgrund von Schließungen verwenden jedoch alle Lambdas denselben erfassten Verweis auf i.
Unerwartetes Druckergebnis:
Wenn die Schleife beendet wird, wird i zu 10 und alle Lambdas zeigen nun auf diesen Endwert. Infolgedessen wird bei der Ausführung des Lambda zehnmal „10“ ausgegeben, statt der erwarteten Reihenfolge von 0 bis 9.
Dieses Verhalten resultiert aus Lambda-Abschlüssen, die Verweise auf Variablen, die in ihrem Gültigkeitsbereich deklariert wurden, auch nach Abschluss der Schleife beibehalten.
Vermeidungsmaßnahmen und Alternativen:
Um dieses Problem zu lösen, erstellen Sie eine lokale Variable in der Schleife und weisen Sie ihr den Wert der Iterationsvariablen zu:
<code class="language-c#">for (int i = 0; i < 10; i++) { int j = i; // 创建一个局部变量 Action action = () => Console.WriteLine(j); actions.Add(action); } foreach (var action in actions) { action(); }</code>
Dadurch wird sichergestellt, dass jedes Lambda einen anderen Wert von j erfasst, was zu der erwarteten Druckfolge führt.
Beachten Sie, dass die Verwendung von Iterationsvariablen direkt in Lambda-Ausdrücken zu unerwarteten Bedingungen im Zusammenhang mit dem Abschluss führen kann. Erwägen Sie stattdessen die Erstellung lokaler Variablen, um genau den Wert zu erfassen, den Sie benötigen.
Das obige ist der detaillierte Inhalt vonWarum erfassen Lambda-Ausdrücke den Endwert von Iterationsvariablen und wie kann dies vermieden werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!