Aşağıdaki kod çıktıları 012 yerine 33. Her bir yineleme döngüsünde neden aynı değişkeni yakalamak yerine yeni bir değişken loopScopedi'nin yakalanmadığını anlamıyorum.C# Lambda ifadeleri içinde değişkenleri bildirme
Action[] actions = new Action[3];
for (int i = 0; i < 3; i++)
{
actions [i] =() => {int loopScopedi = i; Console.Write (loopScopedi);};
}
foreach (Action a in actions) a(); // 333
Hopwever, bu kod 012 üretir. İkisi arasındaki fark nedir?
Action[] actions = new Action[3];
for (int i = 0; i < 3; i++)
{
int loopScopedi = i;
actions [i] =() => Console.Write (loopScopedi);
}
foreach (Action a in actions) a(); // 012
Ah bu değiştirilmiş bir kapatma sorunu - bkz http://stackoverflow.com/questions/235455/access-to-modified-closure –
Kapatma sorunu: http://www.codethinked.com/c-closures-explained Örneğin. Davranış farklıdır. Net < 4.5 and > = 4.5 –
Bu iki girişi Eric Lippert'den okuyun http://blogs.msdn.com/b/ericlippert/archive/2009/11/16/closing-over-the-loop-variable-part -two.aspx ve http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx – Icarus