Heim > Backend-Entwicklung > C++ > Warum erfassen Lambda-Ausdrücke den Endwert von Iteratorvariablen in C#?

Warum erfassen Lambda-Ausdrücke den Endwert von Iteratorvariablen in C#?

Barbara Streisand
Freigeben: 2024-10-29 11:02:02
Original
763 Leute haben es durchsucht

Why Do Lambda Expressions Capture the Final Value of Iterator Variables in C#?

Verwenden von Lambda-Ausdrücken mit Iteratoren in C#

In C# bieten Lambda-Ausdrücke eine prägnante und bequeme Möglichkeit, anonyme Funktionen zu definieren. Eine häufige Gefahr bei der Verwendung von Lambda-Ausdrücken mit Iteratoren besteht jedoch darin, dass die erfasste Variable nicht der aktuelle Wert der Iteratorvariablen ist, sondern der Endwert.

Bedenken Sie den folgenden Code:

<code class="c#">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"));
}</code>
Nach dem Login kopieren

Wenn Sie diesen Code ausführen, erwarten Sie möglicherweise, dass er die folgende Ausgabe ausgibt:

Hi String
Hi Single
Hi Int32
Nach dem Login kopieren

Die tatsächliche Ausgabe lautet jedoch:

Hi Int32
Hi Int32
Hi Int32
Nach dem Login kopieren

Dies liegt daran, dass der Lambda-Ausdruck erfasst der Schleifenvariablentyp, nicht sein Wert zum Zeitpunkt der Lambda-Definition. Wenn das Lambda ausgeführt wird, verwendet es daher den Endwert des Typs Int32.

Um dieses Problem zu beheben und die gewünschte Ausgabe zu erhalten, können Sie eine lokale Variable verwenden, um den aktuellen Wert des Iterators zu erfassen Variable, wie im folgenden Code gezeigt:

<code class="c#">foreach (var type in types)
{
    var newType = type;
    var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting));
    helloMethods.Add(sayHello);
}</code>
Nach dem Login kopieren

In diesem Fall erfasst der Lambda-Ausdruck die lokale Variable newType, der der aktuelle Wert von Typ zugewiesen wird. Dadurch wird sichergestellt, dass der Lambda-Ausdruck bei der Ausführung den richtigen Wert vom Typ verwendet.

Das obige ist der detaillierte Inhalt vonWarum erfassen Lambda-Ausdrücke den Endwert von Iteratorvariablen in C#?. 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