我來自功能編程背景,所以如果我不理解C#中的閉包,請原諒我。C#事件處理程序委託中的閉包?
我有以下代碼,以動態生成得到匿名事件處理程序的按鈕:
for (int i = 0; i < 7; i++)
{
Button newButton = new Button();
newButton.Text = "Click me!";
newButton.Click += delegate(Object sender, EventArgs e)
{
MessageBox.Show("I am button number " + i);
};
this.Controls.Add(newButton);
}
我預計文本"I am button number " + i
同在的for循環迭代的i
價值被關閉。但是,當我真正運行該程序時,每個按鈕都表示I am button number 7
。我錯過了什麼?我正在使用VS2005。
編輯:所以我想我的下一個問題是,我如何捕獲價值?
您不捕獲該值。你永遠不會捕獲值,只有變量。有關此問題的更多信息,請參閱http://blogs.msdn.com/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx和http://blogs.msdn .com/ericlippert/archive/2009/11/16/closing-the-loop-variable-part-two.aspx – 2010-02-09 06:37:42