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
Barbara StreisandOriginal
2025-02-03 08:10:09799Durchsuche

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:

<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.

erreicht

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!

Stellungnahme:
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