Heim >Backend-Entwicklung >C++ >Warum erfassen C# Lambda -Ausdrücke in Schleifen den endgültigen variablen Wert und wie kann dies behoben werden?
C# Lambda Expression Variable erfassen in Schleifen
Ein häufiges Problem bei der C# -Programmierung beinhaltet Lambda -Ausdrücke in Schleifen. Die Art und Weise, wie Lambda -Ausdrücke Variablen erfassen, kann zu unerwarteten Ergebnissen führen. Erforschen wir dieses Problem und seine Lösung.
Betrachten Sie diesen Code:
<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>(); int variable = 0; while (variable < 10) { actions.Add(() => variable * 2); ++variable; } foreach (var act in actions) { Console.WriteLine(act.Invoke()); }</code>
Die erwartete Ausgabe ist eine Folge gleicher Zahlen (0, 2, 4, 6, 8). Die tatsächliche Ausgabe beträgt jedoch fünf 10s. Dies geschieht, weil jeder Lambda -Ausdruck eine Referenz auf den variable
erfasst, nicht zum Zeitpunkt seiner Schöpfung. Bis die Lambdas aufgerufen werden, hat variable
bereits seinen Endwert von 10.
Die Lösung: Erstellen einer Kopie
Um dies zu korrigieren, müssen wir eine Kopie der Schleifenvariablen im Bereich jedes Lambda -Ausdrucks erstellen:
<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>(); int variable = 0; while (variable < 10) { int copy = variable; // Create a copy of the variable actions.Add(() => copy * 2); ++variable; } foreach (var act in actions) { Console.WriteLine(act.Invoke()); }</code>
Nun erfasst jeder Lambda -Ausdruck seine eigene unabhängige Kopie von variable
zum Zeitpunkt seiner Erstellung, wobei die erwartete Ausgabe erzeugt wird.
C# 5 und foreach Loops
Es ist wichtig zu beachten, dass dieses Verhalten weniger an foreach
-Sloops in C# 5 und späteren Versionen betrifft. Der Compiler behandelt die variable Erfassung in foreach
unterschiedlich, um dieses Problem zu verhindern. Die explizite Kopiermethode bleibt jedoch eine Best Practice für Klarheit und Kompatibilität mit älteren C# -Versionen. Die Verwendung dieses Ansatzes sorgt für ein konsistentes Verhalten in allen C# -Versionen und Schleifentypen.
Das obige ist der detaillierte Inhalt vonWarum erfassen C# Lambda -Ausdrücke in Schleifen den endgültigen variablen Wert und wie kann dies behoben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!