Heim > Backend-Entwicklung > C++ > Hauptteil

Warum erfassen alle Lambda-Ausdrücke in einer foreach-Schleife dieselbe Variable und nicht ihre einzelnen Werte?

Patricia Arquette
Freigeben: 2024-10-28 22:16:30
Original
365 Leute haben es durchsucht

Why do all lambda expressions in a foreach loop capture the same variable instead of their individual values?

Erfasste Variablen in Lambda-Ausdrücken: Das Geheimnis der „foreach-Schleifenvariablen“ entmystifizieren

Betrachten Sie den folgenden verwirrenden Code, der darauf abzielt, eine Liste zu erstellen von Methoden, die verschiedene Datentypen begrüßen:

public class MyClass
{
    public delegate string PrintHelloType(string greeting);

    public void Execute()
    {
        Type[] types = new Type[]{typeof(string), typeof(float), typeof(int)};
        List<PrintHelloType> helloMethods = new List<PrintHelloType>();

        foreach (var type in types) {
            var sayHello = new PrintHelloType(greeting => SayGreetingToType(type, greeting));
            helloMethods.Add(sayHello);
        }

        foreach (var helloMethod in helloMethods) {
            Console.WriteLine(helloMethod("Hi"));
        }
    }

    public string SayGreetingToType(Type type, string greetingText) {
        return greetingText + " " + type.Name;
    }
}
Nach dem Login kopieren

Wenn Sie diesen Code jedoch ausführen, stoßen Sie auf ein unerwartetes Ergebnis: Er gibt dreimal „Hi Int32“ aus, anstelle des beabsichtigten „Hi String“, „Hi Single“, „Hi Int32“. Was ist hier los?

Die Subtilität von Abschlüssen und erfassten Variablen

Der Schlüssel zum Verständnis dieses Verhaltens liegt im Konzept von Abschlüssen und erfassten Variablen. Wenn ein Lambda-Ausdruck erstellt wird, erfasst er die Variablen aus seinem umgebenden Bereich. In diesem Fall erfasst der Lambda-Ausdruck die Typvariable aus der foreach-Schleife.

Erfasste Schleifenvariablen: Eine Gefahr

Entscheidend ist, dass die erfasste Variable nicht der Wert von ist Typ, sondern die Variable selbst. Während die Schleife fortschreitet, ändert sich die Typvariable, während die Lambda-Ausdrücke immer noch auf dieselbe erfasste Variable verweisen.

Problem beheben

Um das beabsichtigte Verhalten zu erreichen, ist es Es ist notwendig, eine neue Variable innerhalb der Schleife zu erstellen, um den beabsichtigten Wert zu erfassen. So ändern Sie den Code:

foreach (var type in types) {
   var newType = type;
   var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting));
   helloMethods.Add(sayHello);
}
Nach dem Login kopieren

Durch die Erfassung von newType anstelle des Typs haben die Lambda-Ausdrücke jetzt einen konstanten Verweis auf den beabsichtigten Wert und die erwartete Ausgabe wird erhalten.

Fazit

Bei der Arbeit mit Lambda-Ausdrücken ist es wichtig, die Feinheiten von Abschlüssen und erfassten Variablen zu verstehen. Indem Sie diese Mechanismen berücksichtigen, können Sie unerwartetes Verhalten vermeiden und sicherstellen, dass Ihr Code wie vorgesehen funktioniert.

Das obige ist der detaillierte Inhalt vonWarum erfassen alle Lambda-Ausdrücke in einer foreach-Schleife dieselbe Variable und nicht ihre einzelnen Werte?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!