Heim >Backend-Entwicklung >C++ >Wie stelle ich sicher, dass Lambda-Ausdrücke Variablen nach Wert statt nach Referenz in C# erfassen?

Wie stelle ich sicher, dass Lambda-Ausdrücke Variablen nach Wert statt nach Referenz in C# erfassen?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-19 00:14:11264Durchsuche

How Do I Ensure Lambda Expressions Capture Variables by Value Instead of by Reference in C#?

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.

  • Erfassung durch Referenz: Lambda-Ausdrücke greifen direkt auf den Speicherort der Originalvariablen zu. Alle Änderungen an Variablen außerhalb des Lambda-Ausdrucks werden im Lambda-Ausdruck widergespiegelt und umgekehrt.
  • Erfassung nach Wert: Lambda-Ausdrücke greifen bei der Erfassung auf eine Kopie des ursprünglichen Variablenwerts zu. Alle Änderungen an Variablen außerhalb des Lambda-Ausdrucks wirken sich nicht auf die vom Lambda-Ausdruck erfasste Kopie aus und der Wert des Lambda-Ausdrucks bleibt unverändert.

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!

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