c# foreach
Loops: Ein Designfehler, der zu Schließungsproblemen führt
Verwenden von Lambda -Ausdrücken oder anonymen Methoden in C #s foreach
Loops können Fehler "Zugriff auf modifizierte Verschluss" erstellen. Der Umgang mit dem Compiler mit der Schleifenvariablen ist ein Schlüsselfaktor in diesem Problem.
Das Problem mit dem variablen Bereich
Im Gegensatz zu den meisten Sprachen deklariert C# die foreach
-Kleifenvariable außerhalb den Körper des Schleifens. Dies bedeutet, dass nur eine Variableninstanz für die gesamte Schleife vorhanden ist. Jede Iteration aktualisiert diese einzelne Variable und führt zu unerwartetem Verhalten, wenn sie innerhalb von Schließungen verwendet werden. Verschlüsse erfassen dann den endgültigen -Werte der Variablen, nicht den Wert aus jeder Iteration.
Schleifen variable Einschränkungen
Eine andere Einschränkung ist, dass die Variablen von foreach
Schleifen nicht außerhalb des Rahmens der Schleife zugegriffen werden können. Dies steht im Widerspruch zu der Art und Weise, wie sich Schleifenvariablen in anderen Sprachen typischerweise verhalten und Entwickler dazu zwingt, Problemumgehungen zu verwenden, wenn sie nach Abschluss der Schleife den Wert der Variablen benötigen.
Warum dieses Design?
Die anfängliche C# Spezifikation war mehrdeutig über den Umfang der foreach
-Sloadvariablen. Wenn in C# 2.0 eine Schließunterstützung hinzugefügt wurde, wurde die Entscheidung, die Variable außerhalb der Schleife (ähnlich wie for
Loops) zu platzieren, getroffen. Dies hat sich jedoch als problematisch erwiesen, das erwartete Verhalten widerspricht und Fehler verursacht.
C# 5's Lösung
Erkennen Sie diesen Entwurfsfehler und adressierte ihn in C# 5. In C# 5 und später wird die foreach
-Schloop -Variable nun in jeder Iteration in abgebildet. Dies stellt sicher, dass die Schließungen eine neue Instanz der Variablen für jeden Schleifenzyklus erfassen, das Problem "Zugriff auf modifiziertes Schließung" und C# mit allgemeinen Programmierpraktiken auflösen.
Das obige ist der detaillierte Inhalt vonWarum führt C#'für die Variable von C#' foreach 'eine Wiederverwendung zu Schließungsstricken?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!