Vengo de un fondo de programación funcional en este momento, así que perdónenme si no entiendo los cierres en C#.¿Cierres en los delegados del controlador de eventos C#?
Tengo el siguiente código para generar dinámicamente botones que obtienen los controladores de eventos anónimos:
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);
}
que esperaba el texto "I am button number " + i
que ser cerrado con el valor de i
en esa iteración del bucle. Sin embargo, cuando realmente ejecuto el programa, cada botón dice I am button number 7
. ¿Qué me estoy perdiendo? Estoy usando VS2005.
Editar: Así que supongo que mi próxima pregunta es, ¿cómo puedo capturar el valor?
No captura el valor. Nunca se capturan valores, solo variables. Para obtener más información sobre este tema, consulte http://blogs.msdn.com/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx y http: //blogs.msdn. .com/ericlippert/archive/2009/11/16/closing-over-the-loop-variable-part-two.aspx –