Heim > Backend-Entwicklung > C++ > Warum erfassen C# Lambda -Ausdrücke in Schleifen den endgültigen variablen Wert und wie kann dies behoben werden?

Warum erfassen C# Lambda -Ausdrücke in Schleifen den endgültigen variablen Wert und wie kann dies behoben werden?

Barbara Streisand
Freigeben: 2025-02-03 08:10:09
Original
851 Leute haben es durchsucht

Why Do C# Lambda Expressions in Loops Capture the Final Variable Value, and How Can This Be Fixed?

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:

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());
}
Nach dem Login kopieren

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.

erreicht

Die Lösung: Erstellen einer Kopie

Um dies zu korrigieren, müssen wir eine Kopie der Schleifenvariablen im Bereich jedes Lambda -Ausdrucks erstellen:

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());
}
Nach dem Login kopieren

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!

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