我来自功能编程背景,所以如果我不理解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