Heim  >  Artikel  >  Backend-Entwicklung  >  Warum erfasst ein Lambda-Ausdruck während jeder Iteration in einer foreach-Schleife den Endwert einer Iteratorvariablen anstelle ihres Werts?

Warum erfasst ein Lambda-Ausdruck während jeder Iteration in einer foreach-Schleife den Endwert einer Iteratorvariablen anstelle ihres Werts?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-31 08:43:02600Durchsuche

Why does a lambda expression capture the final value of an iterator variable instead of its value during each iteration in a foreach loop?

Unerwartetes Verhalten in Lambda-Ausdrücken unter Verwendung der Iteratorvariablen

Im angegebenen Code lautet die erwartete Ausgabe beim Aufruf von myClass.Execute() „Hi String“, „Hi Single“, „Hi Int32.“ Der Code gibt jedoch dreimal „Hi Int32“ aus. Warum tritt dieses unerwartete Verhalten auf und wie kann es korrigiert werden?

Das Problem liegt im Lambda-Ausdruck, der in der foreach-Schleife verwendet wird:

var sayHello = new PrintHelloType(greeting => SayGreetingToType(type, greeting));

In diesem Code ist der Schleifenvariablentyp wird vom Lambda-Ausdruck erfasst. Was jedoch erfasst wird, ist nicht der Wert von „type“ bei der spezifischen Iteration, sondern der Verweis auf die Variable selbst.

Wenn der PrintHelloType-Delegat später aufgerufen wird, verwendet er daher den Wert von „type“ am Ende von die Schleife, die „Int32“ ist. Dies führt zu einer unerwarteten Ausgabe.

Lösung:

Um das gewünschte Ziel zu erreichen, kann eine neue Variable verwendet werden, um den Wert von Typ während jeder Iteration zu erfassen:

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

Jetzt erfasst jeder Lambda-Ausdruck den Wert von newType, der der richtige Wert für die spezifische Iteration ist. Anschließend wird die erwartete Ausgabe erzeugt: „Hi String“, „Hi Single“, „Hi Int32.“

Das obige ist der detaillierte Inhalt vonWarum erfasst ein Lambda-Ausdruck während jeder Iteration in einer foreach-Schleife den Endwert einer Iteratorvariablen anstelle ihres Werts?. 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