Heim > Backend-Entwicklung > C++ > Referenz vs. Kopie in C# Lambda Capture: Wann erhalte ich unerwartetes Verhalten?

Referenz vs. Kopie in C# Lambda Capture: Wann erhalte ich unerwartetes Verhalten?

Patricia Arquette
Freigeben: 2025-01-18 23:56:10
Original
351 Leute haben es durchsucht

Reference vs. Copy in C# Lambda Capture: When Do I Get Unexpected Behavior?

Umfassendes Verständnis der Lambda-Erfassung in C#: Referenzieren und Kopieren

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:

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();
    }
}
Nach dem Login kopieren

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:

[=] () => { ... } // 捕获副本
Nach dem Login kopieren

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:

for (int i = 0; i < 10; i++)
{
    int copy = i; // 创建一个局部副本
    actions.Add(() => Console.WriteLine(copy));
}
Nach dem Login kopieren

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!

Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage