c# foreach
Schleifenvariable Wiederverwendung: Probleme und Lösungen
c# Lambda -Ausdrücke und anonyme Methoden führen das Problem "modifizierter Verschluss" innerhalb von foreach
Loops ein. Betrachten Sie dieses Beispiel:
<code class="language-csharp">foreach (var s in strings) { query = query.Where(i => i.Prop == s); // Modified closure issue ... }</code>
Der generierte Code des Compilers zeigt das Stamm des Problems an:
<code class="language-csharp">string s; while (enumerator.MoveNext()) { s = enumerator.Current; ... }</code>
Die s
Variable wird außerhalb der Schleife deklariert. Dieses Design schien anfangs anscheinend zu Problemen zu Problemen zu sehen. Es bietet keinen Leistungsvorteil und beschränkt die variable Verwendung außerhalb der Schleife.
Warum dieses Design?
Diese Variable -Wiederverwendung war eine Designauswahl in früher C# (1.0). Der Unterschied zwischen einer inneren und äußeren Variablen wurde als unbedeutend eingestuft. Die Verschlusssemantik von C# 2.0 veränderte dies jedoch. Aufrechterhaltung der Konsistenz mit for
Schleifen wurde die Schleifenvariable nach draußen platziert.
Änderungen in C# 5 und später
Erkennen der Fehler, C# 5 führte eine Breaking -Änderung ein: Die Variable foreach
Schleife ist jetzt logisch in den Körper der Schleife. Jede Iteration erhält eine frische Kopie.
Dies löst das Problem "modifizierter Verschluss", wodurch die ältere Methode unsicher wird. Es zeigt auch die Bedeutung der sorgfältigen var
-Stywordsverwendung, insbesondere bei Lambdas oder anonymen Methoden in foreach
Loops.
Das obige ist der detaillierte Inhalt vonWarum verursacht C# foreach Loop -Variable Wiederverwendung 'Zugriff auf geänderte Schließung' Probleme?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!