Je viens d'un contexte de programmation fonctionnelle en ce moment, alors pardonnez-moi si je ne comprends pas les fermetures en C#.Fermetures dans les délégués du gestionnaire d'événements C#?
J'ai le code suivant pour générer dynamiquement des boutons qui obtiennent des gestionnaires d'événements anonymes:
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);
}
attendu Le texte "I am button number " + i
être fermé à la valeur de i
à cette itération de la boucle. Cependant, quand je cours réellement le programme, chaque bouton indique I am button number 7
. Qu'est-ce que je rate? J'utilise VS2005. Edit: Donc, je suppose que ma prochaine question est, comment puis-je capturer la valeur?
Vous ne capturez pas la valeur. Vous ne capturez jamais de valeurs, seulement des variables. Pour plus d'informations sur ce problème, voir http://blogs.msdn.com/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx et http: //blogs.msdn .com/ericlippert/archive/2009/11/16/fermeture-sur-la-boucle-variable-partie-deux.aspx –