Verständnis der C# Lambda -Expression in Schleifen und seine Lösung
c# lambda -Ausdrücke in Schleifen weisen eine gemeinsame Gefahr auf: Sie erfassen dieselbe Variable, was zu unerwarteten Ergebnissen führt. Dies tritt auf, weil der Lambda -Ausdruck den -Wert der Variablen zum Zeitpunkt seiner Erstellung nicht erfasst, sondern eher eine -Referenz auf die Variable selbst. Betrachten Sie dieses Beispiel:
<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>(); int variable = 0; while (variable < 5) { actions.Add(() => variable * 2); ++variable; } foreach (var act in actions) { Console.WriteLine(act.Invoke()); }</code>
Anstelle der erwarteten Ausgabe (0, 2, 4, 6, 8) gibt der Code fünf 8s aus. Dies liegt daran
Die Lösung: Erstellen einer Kopie variable
Erstellen Sie in jeder Iteration eine Kopie der Schleifenvariablen: eine Kopie der Schleifenvariablen:
Jetzt erfasst jeder Lambda -Ausdruck eine eigenständige
Variable, die zu der richtigen Ausgabe führt.<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>(); int variable = 0; while (variable < 5) { int copy = variable; // Create a copy actions.Add(() => copy * 2); ++variable; }</code>
copy
c# 5 und später: foreach und catvs
In C# 5 und späteren Versionen hat sich das Verhalten der -Sloop geändert, um dieses Problem zu lösen. Der Compiler verwendet "temporäre Variablen der Schließzuweisung" (CATVS), um automatisch eine separate Variable für jede Iteration zu erstellen, wodurch die Notwendigkeit manueller Kopien beseitigt. Diese Vereinfachung macht den Code sauberer und lesbarer. Für das Beispiel für die
-Schleife ist jedoch die explizite Kopie erforderlich.Das obige ist der detaillierte Inhalt vonWarum erfassen C# Lambda -Ausdrücke in Schleifen dieselbe Variable und wie kann dies aufgelöst werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!