Heim >Backend-Entwicklung >C++ >Warum erfasst mein C# Loop den falschen variablen Wert?
Abdeckvariable im Zyklus: Ein seltsames Problem
Wenn Sie den C#-Zyklus verwenden, können Sie auf ein spezielles Problem zum Erfassen von Variablen stoßen. Betrachten wir die folgenden Szenen:
Im Gegensatz zu erwartet druckt dieser Code fünf "10" anstelle der erwarteten Sequenz 0, 2, 4, 6, 8.
<code class="language-csharp">List<Action> actions = new List<Action>(); int variable = 0; while (variable < 5) { actions.Add(() => Console.WriteLine(variable * 2)); ++variable; } foreach (var act in actions) { act.Invoke(); }</code>
<:> Frage: Die Erfassungsvariable im Zyklus
Alle Lambda -Funktionen, die im Zyklus erstellt wurden, erfassen dieselbe Variable . Wenn diese Funktionen außerhalb von außen aufgerufen werden, zitieren sie alle den Endwert von
.
variable
Lösung: Rettung variable
Um dieses Problem zu lösen, müssen Sie eine Kopie der Variablen im Zyklus erstellen und dann in jeder Lambda -Funktion erfassen:
Durch das Erstellen einer Kopie erfasst jeder im Zyklus erstellte Verschluss seinen eigeneneindeutigen Wert, wodurch die erwartete Ausgabe generiert wird.
<code class="language-csharp">while (variable < 5) { int copy = variable; actions.Add(() => Console.WriteLine(copy * 2)); ++variable; }</code>Vorsichtsmaßnahmen
variable
Das obige ist der detaillierte Inhalt vonWarum erfasst mein C# Loop den falschen variablen Wert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!