C # 'da lambda ifadeleri veya anonim yöntemler kullanırken , değiştirilmiş kapatma tuzağına erişim konusunda dikkatli olmalıyız . Örneğin:
foreach (var s in strings)
{
query = query.Where(i => i.Prop == s); // access to modified closure
...
}
Değiştirilen kapatma nedeniyle, yukarıdaki kod Where
, sorgudaki tüm yan tümcelerin son değerine dayanmasına neden olur s
.
As açıkladı buradan çünkü bu durumda, s
değişken beyan foreach
yukarıdaki derleyici böyle çevrilmiştir döngü:
string s;
while (enumerator.MoveNext())
{
s = enumerator.Current;
...
}
bunun yerine:
while (enumerator.MoveNext())
{
string s;
s = enumerator.Current;
...
}
Belirttiği gibi burada , döngü dışında bir değişkeni bildirmek için herhangi bir performans avantajları vardır ve döngü kapsamı dışında değişkeni kullanmayı planlıyorsanız normal şartlar altında tek nedeni budur yapmak için düşünebilirsiniz:
string s;
while (enumerator.MoveNext())
{
s = enumerator.Current;
...
}
var finalString = s;
Ancak bir foreach
döngüde tanımlanan değişkenler döngü dışında kullanılamaz:
foreach(string s in strings)
{
}
var finalString = s; // won't work: you're outside the scope.
Böylece derleyici, değişkeni, algılanabilir fayda üretmezken, genellikle bulunması ve hata ayıklaması zor olan bir hataya son derece eğilimli olacak şekilde bildirir.
foreach
Bu şekilde döngülerle yapabileceğiniz bir şey var mı, iç kapsamlı bir değişkenle derlenmişlerse yapamazsınız mı, yoksa bu sadece anonim yöntemler ve lambda ifadeleri kullanılabilir veya yaygın olandan önce yapılan keyfi bir seçim mi? O zamandan beri revize edilmedi mi?
foreach
değil, OP tarafından gösterilene benzer bir kodla sonuçlanan lamda ifadeleri hakkında ...
String s; foreach (s in strings) { ... }
?