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>
Wenn Sie diesen Code ausführen, erwarten Sie möglicherweise, dass er die folgende Ausgabe ausgibt:
Hi String Hi Single Hi Int32
Die tatsächliche Ausgabe lautet jedoch:
Hi Int32 Hi Int32 Hi Int32
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>
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!