Heim >Backend-Entwicklung >C++ >Wie verhindere ich unerwartetes Verhalten beim Erfassen von Variablen in C#-Lambda-Ausdrücken?
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!