Heim >Backend-Entwicklung >C++ >Referenz vs. Kopie in C# Lambda Capture: Wann erhalte ich unerwartetes Verhalten?
In C# können Lambda-Ausdrücke Variablen im umschließenden Bereich erfassen. Wenn ein Lambda einen Verweis auf eine Variable erfasst, werden alle Änderungen an dieser Variablen im Lambda widergespiegelt. Dies kann zu unerwartetem Verhalten führen, wie im folgenden Codeausschnitt gezeigt:
<code class="language-C#">class Program { delegate void Action(); static void Main(string[] args) { 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>
Wenn Sie diesen Code ausführen, wird die Zahl 10 zehnmal gedruckt. Dies liegt daran, dass die Lambda-Funktion einen Verweis auf die Variable i
erfasst und wenn i
in der for-Schleife inkrementiert wird, sieht die Lambda-Funktion weiterhin den aktualisierten Wert.
Um eine Kopie einer Variablen anstelle einer Referenz zu erfassen, können Sie die folgende Syntax verwenden:
<code class="language-C#">[=] () => { ... } // 捕获副本</code>
In diesem Beispiel erfasst die Lambda-Funktion eine Kopie der Variablen i
und alle Änderungen an i
im umschließenden Bereich werden nicht in der Lambda-Funktion widergespiegelt.
Hier ist ein modifiziertes Beispiel, das zeigt, wie eine Kopie erfasst wird:
<code class="language-C#">for (int i = 0; i < 10; i++) { int copy = i; // 创建一个局部副本 actions.Add(() => Console.WriteLine(copy)); }</code>
In diesem Fall gibt die Lambda-Funktion den Wert von copy
aus, der eine Kopie des Werts von i
zum Zeitpunkt der Erstellung der Lambda-Funktion ist.
Wenn Sie den Unterschied zwischen der Erfassung einer Referenz und der Erfassung einer Kopie verstehen, können Sie unerwartetes Verhalten in Ihren Lambda-Funktionen vermeiden.
Das obige ist der detaillierte Inhalt vonReferenz vs. Kopie in C# Lambda Capture: Wann erhalte ich unerwartetes Verhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!