Beim Definieren von Lambda-Ausdrücken in C# ist es wichtig zu verstehen, wie sie mit externen Variablen interagieren. Standardmäßig neigen Lambda-Ausdrücke dazu, Verweise auf externe Variablen zu erfassen. In manchen Fällen ist es jedoch entscheidend, sie zum Kopieren dieser Variablen zu zwingen.
Betrachten Sie das folgende Beispiel, das dazu dient, eine Reihe von Zahlen mithilfe eines Lambda-Ausdrucks und einer Schleife auszugeben:
<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>
Der obige Codeausschnitt gibt jedoch wiederholt „10“ aus, was darauf hinweist, dass der Lambda-Ausdruck einen Verweis auf die gemeinsam genutzte Variable i erfasst. Auch wenn sich der Wert von i während der Schleife ändert, gibt der Lambda-Ausdruck immer den Endwert von i aus, der 10 ist.
Um den Lambda-Ausdruck zu zwingen, eine Kopie der Variablen anstelle einer Referenz zu erfassen, besteht eine Problemumgehung darin, eine lokale Kopie der Variablen innerhalb der Schleife zu erstellen:
<code class="language-csharp">for (int i = 0; i < 10; i++) { int copy = i; // 创建局部副本 actions.Add(() => Console.WriteLine(copy)); }</code>
Durch das Kopieren des Werts von i in eine neue Variablenkopie erfasst der Lambda-Ausdruck effektiv den Wert von i zu einem bestimmten Zeitpunkt und in einem bestimmten Bereich. Dadurch wird sichergestellt, dass der Lambda-Ausdruck bei jeder Iteration der Schleife die richtige Zahl ausgibt.
Das Verständnis dieses Verhaltens ist für die Verwendung von Lambda-Ausdrücken in C# von entscheidender Bedeutung. Damit können Entwickler steuern, wie Lambda-Ausdrücke mit gemeinsam genutzten Variablen interagieren, und sicherstellen, dass Programme wie erwartet ausgeführt werden.
Das obige ist der detaillierte Inhalt vonErfassen von Kopien oder Referenzen in C#-Lambdas: Wann sollten Sie welche auswählen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!