我有以下方法:爲什麼c#不保留匿名委託調用的上下文?
static Random rr = new Random();
static void DoAction(Action a)
{
ThreadPool.QueueUserWorkItem(par =>
{
Thread.Sleep(rr.Next(200));
a.Invoke();
});
}
現在我把這種在一個for循環是這樣的:
for (int i = 0; i < 10; i++)
{
var x = i;
DoAction(() =>
{
Console.WriteLine(i); // scenario 1
//Console.WriteLine(x); // scenario 2
});
}
在場景1的輸出是:10 10 10 10 ... 10
在場景2的輸出是: 2 6 5 8 4 ... 0
(0到9的隨機排列)
你如何解釋這個? c#不應該爲匿名委託調用保留變量(這裏是i
)?
但保留( '捕獲')的*變量*'i'是*正是*發生了什麼事! *儘管你希望它發生*,但是在代表成立時保留* i的**值**。 – AakashM 2012-01-13 16:38:37
順便提及,ReSharper的將發出警告關於[訪問改性閉合](http://confluence.jetbrains.net/display/ReSharper/Access+to+modified+closure)時與此代碼呈現;你可能會發現有幫助的解釋。 – AakashM 2012-01-13 16:40:38
http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx – 2012-01-13 17:03:31