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.
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(); }
<:> 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.
while (variable < 5) { int copy = variable; actions.Add(() => Console.WriteLine(copy * 2)); ++variable; }
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!