Lambda -Ausdrücke bieten eine kurze Möglichkeit, Inline -Funktionen in einer Schleife zu definieren. Die Verwendung iterativer Variablen direkt in Lambdas kann jedoch später zu unerwartetem Verhalten führen.
lambda fallen für iterierende variablen:
Betrachten Sie den folgenden Code:
for (int i = 0; i Console.WriteLine(i);
actions.Add(action);
}
foreach (var action in actions) {
action();
}
Die Leute könnten denken, dass jede Lambda den entsprechenden Wert von i druckt. Alle Lambdas haben jedoch aufgrund von Schließungen denselben Capture -Verweis auf I.
zufälliges Druckergebnis:
Wenn die Schleife beendet, werde ich 10 und alle Lambdas zeigen nun auf diesen Endwert. Infolgedessen druckt die Ausführung des Lambda zehnmal "10" anstelle der erwarteten Sequenz von 0 auf 9.
Dieses Verhalten stammt aus dem Lambda -Verschluss, weist Verweise auf Variablen bei, die in seinem Geltungsbereich deklariert wurden, auch wenn die Schleife abgeschlossen wurde.
Vermeidung und alternative Methoden:
]Um dieses Problem zu lösen, erstellen Sie eine lokale Variable in der Schleife und weisen Sie es dem Wert der iterativen Variablen zu:
for (int i = 0; i Console.WriteLine(j);
actions.Add(action);
}
foreach (var action in actions) {
action();
}
Dies stellt sicher, dass jedes Lambda einen anderen Wert von J erfasst, was zu der erwarteten Drucksequenz führt.
Denken Sie daran, dass die Verwendung iterativer Variablen direkt in Lambda -Ausdrücken zu unerwarteten Situationen im Zusammenhang mit Schließungen führen kann. Erwägen Sie stattdessen lokale Variablen zu erstellen, um die erforderlichen Werte genau zu erfassen.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3