在以下程序中,DummyMethod始終會打印5.但是,如果我們使用註釋代碼,則會得到不同的值(即1,2,3,4)。任何人都可以解釋爲什麼這會發生嗎?C#中的代表問題
delegate int Methodx(object obj);
static int DummyMethod(int i)
{
Console.WriteLine("In DummyMethod method i = " + i);
return i + 10;
}
static void Main(string[] args)
{
List<Methodx> methods = new List<Methodx>();
for (int i = 0; i < 5; ++i)
{
methods.Add(delegate(object obj) { return DummyMethod(i); });
}
//methods.Add(delegate(object obj) { return DummyMethod(1); });
//methods.Add(delegate(object obj) { return DummyMethod(2); });
//methods.Add(delegate(object obj) { return DummyMethod(3); });
//methods.Add(delegate(object obj) { return DummyMethod(4); });
foreach (var method in methods)
{
int c = method(null);
Console.WriteLine("In main method c = " + c);
}
}
此外,如果使用下面的代碼,我會得到所需的結果。
for (int i = 0; i < 5; ++i)
{
int j = i;
methods.Add(delegate(object obj) { return DummyMethod(j); });
}
收取這個問題。這種行爲只是感覺「危險」。我敢打賭,隨着C#越來越多地轉向面向代表的封裝行爲方式,它將會更頻繁地出現,因爲它們是難以調試的問題之一。這就像開關條款的循環等價物被允許在沒有強制性的「休息」的情況下向下級聯一樣。條款 – 2009-11-02 10:57:46
@尼爾:我同意這是一個問題熱點。當用「foreach」看到它時會更加困惑 - 以至於C#團隊正在考慮改變這種情況下的行爲。 (很難想象foreach行爲是否合意的情況; for循環的情況更容易理解,因爲很明顯變量只聲明一次。) – 2009-11-02 11:18:07
[C#Captured Variable In Loop](http: //www.stackoverflow.com/questions/271440/c-sharp-captured-variable-in-loop) – nawfal 2013-11-02 06:09:22