Bei der Verwendung von Lambda-Ausdrücken oder anonymen Methoden in C # müssen wir uns vor dem Zugriff auf modifizierte Abschlussfallen in Acht nehmen. Zum Beispiel:
foreach (var s in strings)
{
query = query.Where(i => i.Prop == s); // access to modified closure
...
}
Aufgrund des geänderten Abschlusses bewirkt der obige Code, dass alle Where
Klauseln in der Abfrage auf dem Endwert von basieren s
.
Wie hier erläutert , geschieht dies, weil die s
in der foreach
obigen Schleife deklarierte Variable im Compiler folgendermaßen übersetzt wird:
string s;
while (enumerator.MoveNext())
{
s = enumerator.Current;
...
}
statt so:
while (enumerator.MoveNext())
{
string s;
s = enumerator.Current;
...
}
Wie hier ausgeführt , bietet das Deklarieren einer Variablen außerhalb der Schleife keine Leistungsvorteile. Unter normalen Umständen kann ich mir nur vorstellen, dies zu tun, wenn Sie die Variable außerhalb des Bereichs der Schleife verwenden möchten:
string s;
while (enumerator.MoveNext())
{
s = enumerator.Current;
...
}
var finalString = s;
In einer foreach
Schleife definierte Variablen können jedoch nicht außerhalb der Schleife verwendet werden:
foreach(string s in strings)
{
}
var finalString = s; // won't work: you're outside the scope.
Daher deklariert der Compiler die Variable so, dass sie sehr anfällig für Fehler ist, die oft schwer zu finden und zu debuggen sind, ohne dass erkennbare Vorteile entstehen.
Gibt es etwas, das Sie mit foreach
Schleifen auf diese Weise tun können, das Sie nicht könnten, wenn sie mit einer Variablen mit innerem Gültigkeitsbereich kompiliert würden, oder ist dies nur eine willkürliche Auswahl, die getroffen wurde, bevor anonyme Methoden und Lambda-Ausdrücke verfügbar oder allgemein waren und die nicht vorhanden sind wurde seitdem nicht mehr überarbeitet?
foreach
sondern über Lamda-Ausdrücke, die zu einem ähnlichen Code führen, wie er vom OP gezeigt wird ...
String s; foreach (s in strings) { ... }
?