.NET(C#): 當for迴圈的聲明變數被委託捕獲

來源:互聯網
上載者:User

發現程式的一個BUG究其原因是因為在for迴圈中用委託捕獲了聲明變數(就是那個常見的變數i),這種情況會發生在當你捕獲了for迴圈的聲明變數,但是在聲明變數已經改變後才去調用委託,你期望得到捕獲變數時的值,但是得到的會是變數最終的值,即便變數類型是實值型別。來看這段代碼:

var list = new Action[5];

for (int i = 0; i < 5; i++)

{

    list[i] = new Action(() => Console.WriteLine(i));

}

 

foreach (var a in list)

    a();

 

顯然我期望每一個Action中捕獲的是當時的值,但是輸出會是:

5

5

5

5

5

 

for中的生命變數其實就是一個局部的全域變數,就類似這樣:

int i = 0;

for (; i < 5; i++)

{ /* ... */ }

 

解決方案就是不用這個for迴圈的聲明變數,可以隨便聲明一個局部臨時變數來儲存當前值:

for (; i < 5; i++)

{

    var local = i;

    list[i] = new Action(() => Console.WriteLine(local));

}

 

這樣不不會輸出5個5了。

 

當然用List.ForEach就不會出現這種問題,代碼:

var list = new Action[5];

Enumerable.Range(0, 5).ToList().ForEach(i =>

{

    list[i] = new Action(() => Console.WriteLine(i));

});

 

foreach (var a in list)

    a();

 

輸出:

0

1

2

3

4

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.