In -tpth diskutieren das Problem der Erfassung von Variablen im C# -Zyklus
In C#stoßen Entwickler auf ein interessantes Problem bei der Verwendung von Erfassungsvariablen in der Zyklus -Iteration. Betrachten Sie das folgende Codefragment:
Obwohl die erwartete Ausgabe 0, 2, 4, 6 und 8 beträgt, ist der Code unerwartet fünf 10. Der Grund für dieses Verhalten sind die erfassten Variablen
<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) { Console.WriteLine(act.Invoke()); }</code>
variable
Lösen Sie das Problem der Erfassungsvariablen variable
Um diese Grenze zu überwinden und jedem Vorgang ihre eigenen Erfassungsvariablen zu haben, bietet C# eine einfache Lösung:
Durch das Erstellen einer Kopie desim Zyklus erfasst jede Operation ihre eigenen alleinigen Beispiele, um sicherzustellen, dass
sich außerhalb des Lambda -Ausdrucks den Erfassungswert nicht beeinflusst.<code class="language-csharp">while (variable < 5) { int copy = variable; actions.Add(() => Console.WriteLine(copy * 2)); ++variable; }</code>
Andere gemeinsame Situationen variable
variable
und Iteration:
In diesen beiden Fällen ist die lokale Kopie der Variablen erforderlich, um die aktuelle Zyklus -Iteration zu erfassen. for
foreach
Schlussfolgerung
<code class="language-csharp">// For loop for (int i = 0; i < 5; i++) { // ... similar issue ... } // Foreach loop // ... similar issue ...</code>
Das Verhalten des Verhaltens der Erfassung von Variablen im C# -Zyklus ist wichtig, um Unfälle zu vermeiden. Die in diesem Artikel diskutierte Lösung stellt sicher, dass jede Operation über eigene unabhängige Erfassungsvariablen verfügt, wodurch vorhersehbare und erwartete Verhaltensweisen erreicht werden.
Das obige ist der detaillierte Inhalt vonWarum führen C# -Schleifen mit erfassten Variablen unerwartete Ergebnisse?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!