Heim  >  Artikel  >  Backend-Entwicklung  >  Warum erfasst mein Lambda-Ausdruck den letzten Wert einer Schleifenvariablen?

Warum erfasst mein Lambda-Ausdruck den letzten Wert einer Schleifenvariablen?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-28 22:50:02657Durchsuche

Why Does My Lambda Expression Capture the Last Value of a Loop Variable?

Erfassen von Variablen in Lambda-Ausdrücken innerhalb von Schleifeniterationen

Der Codeausschnitt demonstriert das unerwartete Verhalten bei Verwendung der Iteratorvariablen einer foreach-Schleife in einem Lambda-Ausdruck. Bei der Ausführung wird statt „Hi String“, „Hi Single“ und „Hi Int32“ „Hi Int32“ für alle drei Methoden ausgegeben.

Erklärung

Dieses Verhalten ist darauf zurückzuführen die Natur von Lambda-Ausdrücken und ihren erfassten Variablen. Wenn ein Lambda-Ausdruck innerhalb einer Schleife definiert wird, erfasst er die Referenz der Schleifenvariablen, nicht ihren Wert. Infolgedessen verweist es während der gesamten Schleifeniterationen auf dieselbe Variable.

Im bereitgestellten Code wird der Variablentyp durch den Lambda-Ausdruck erfasst. Der Code berücksichtigt jedoch nicht die Tatsache, dass alle Iterationen der Schleife denselben Verweis auf den Typ gemeinsam nutzen. Folglich erfasst jeder Lambda-Ausdruck letztendlich den Wert des Typs aus der letzten Iteration, was zu unerwarteten Ausdrucken führt.

Korrektur

Um dieses Problem zu lösen und das gewünschte Ziel zu erreichen, müssen Sie sicherstellen dass jeder Lambda-Ausdruck einen eindeutigen Typwert erfasst. Erstellen Sie dazu für jede Iteration eine neue Variable und weisen Sie ihr den aktuellen Wert des Typs zu:

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

Durch die Verwendung von newType erstellen Sie effektiv eine Kopie des Typs und erfassen seinen Wert aus der aktuellen Iteration. Dadurch wird sichergestellt, dass jeder Lambda-Ausdruck einen eindeutigen Verweis auf seinen eigenen Typwert hat, was zur korrekten Ausgabe führt.

Das obige ist der detaillierte Inhalt vonWarum erfasst mein Lambda-Ausdruck den letzten Wert einer Schleifenvariablen?. 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