Heim > Backend-Entwicklung > C++ > Warum erfassen C# Lambda -Ausdrücke in Schleifen dieselbe Variable und wie kann dies aufgelöst werden?

Warum erfassen C# Lambda -Ausdrücke in Schleifen dieselbe Variable und wie kann dies aufgelöst werden?

Barbara Streisand
Freigeben: 2025-02-03 07:46:13
Original
294 Leute haben es durchsucht

Why Do C# Lambda Expressions in Loops Capture the Same Variable, and How Can This Be Resolved?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage