Heim >Backend-Entwicklung >C++ >Wie stelle ich sicher, dass Lambda-Ausdrücke Variablen nach Wert statt nach Referenz in C# erfassen?
Werterfassung und Referenzerfassung in C#-Lambda-Ausdrücken
In C# können Lambda-Ausdrücke Variablen in einem umschließenden Bereich erfassen. Standardmäßig erfolgen diese Erfassungen per Referenz, was bedeutet, dass der Lambda-Ausdruck auf denselben Speicherort zugreift wie die ursprüngliche Variable. In einigen Fällen möchten Sie jedoch möglicherweise eine Kopie einer Variablen anstelle einer Referenz erfassen.
Frage:
Betrachten Sie den folgenden C#-Code:
<code class="language-csharp">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>
Problembeschreibung:
Die erwartete Ausgabe besteht darin, dass jeder Lambda-Ausdruck seinen entsprechenden i-Wert ausgibt, während er die Liste durchläuft. In diesem Beispiel geben jedoch alle Lambda-Ausdrücke den Wert 10 aus, was darauf hinweist, dass sie sich alle auf dieselbe Variable i beziehen. Dies liegt daran, dass der Lambda-Ausdruck i als Referenz erfasst.
Lösung:
Um den Lambda-Ausdruck zu zwingen, eine Kopie von i zu erfassen, besteht eine Lösung darin, zunächst eine Teilkopie zu erstellen:
<code class="language-csharp">for (int i = 0; i < 10; i++) { int copy = i; // 创建局部副本 actions.Add(() => Console.WriteLine(copy)); }</code>
Erklärung:
Durch die Erstellung einer lokalen Kopie von i in der Schleife erfasst der Lambda-Ausdruck den Wert von copy , der zu diesem Zeitpunkt eine Kopie des ursprünglichen i ist. Dadurch wird sichergestellt, dass jeder Lambda-Ausdruck eine eigene Kopie des Werts hat und der entsprechende i-Wert gedruckt wird.
Unterschied:
Der Unterschied zwischen der Erfassung von Variablen nach Referenz und der Erfassung nach Wert besteht darin, wie sie mit Variablen außerhalb des Lambda-Ausdrucks interagieren.
Das obige ist der detaillierte Inhalt vonWie stelle ich sicher, dass Lambda-Ausdrücke Variablen nach Wert statt nach Referenz in C# erfassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!