Heim >Backend-Entwicklung >C++ >Wie verhindere ich unerwartetes Verhalten beim Erfassen von Variablen in C#-Lambda-Ausdrücken?

Wie verhindere ich unerwartetes Verhalten beim Erfassen von Variablen in C#-Lambda-Ausdrücken?

Barbara Streisand
Barbara StreisandOriginal
2025-01-19 00:06:13231Durchsuche

How Do I Prevent Unexpected Behavior When Capturing Variables in C# Lambda Expressions?

Grundlegendes zur Erfassung von C#-Lambda-Ausdrucksvariablen

C#-Lambda-Ausdrücke bieten eine kompakte Möglichkeit, anonyme Funktionen zu definieren. Allerdings kann ihre Interaktion mit Variablen im umgebenden Bereich schwierig sein.

Das Problem: Änderung gemeinsamer Variablen

Lassen Sie uns ein häufiges Problem untersuchen. Der folgende Code zielt darauf ab, eine Liste von Aktionen zu erstellen, von denen jede einen anderen Zählerwert ausgibt:

<code class="language-csharp">List<Action> actions = new List<Action>();

for (int i = 0; i < 10; i++)
{
    actions.Add(() => Console.WriteLine(i));
}

foreach (Action a in actions)
    a();</code>

Überraschenderweise wird hier zehnmal „10“ gedruckt. Das Lambda erfasst einen Verweis auf i, nicht seinen Wert. Während die Schleife i ändert, sehen alle Lambdas den Endwert.

Die Lösung: Erfassung nach Wert

C# unterstützt nicht direkt die Capture-by-Value-Syntax wie C 0x [=]. Die Problemumgehung besteht darin, eine lokale Kopie innerhalb des Schleifenbereichs zu erstellen:

<code class="language-csharp">for (int i = 0; i < 10; i++)
{
    int copy = i; // Create a local copy
    actions.Add(() => Console.WriteLine(copy));
}</code>

Jetzt erfasst jedes Lambda eine separate copy Variable und behält den korrekten Wert für jede Iteration bei.

Warum lokale Kopien wichtig sind

Der Unterschied liegt im variablen Umfang. Eine Referenz teilt sich denselben Speicherort; Änderungen werden sofort berücksichtigt. Eine Kopie erstellt eine unabhängige Momentaufnahme des Variablenwerts zum Zeitpunkt der Erfassung. Nachfolgende Änderungen an der Originalvariablen sind für die erfasste Kopie des Lambda irrelevant.

Das obige ist der detaillierte Inhalt vonWie verhindere ich unerwartetes Verhalten beim Erfassen von Variablen in C#-Lambda-Ausdrücken?. 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