【发布时间】:2011-08-20 11:38:58
【问题描述】:
我有someFunction(int) 的情况,我需要以编程方式生成n 按钮来调用它。这意味着我想创建按钮B1、B2、...Bn,点击时调用someFunction(1)、someFunction(2)、...someFunction(n)。
这就是我尝试这样做的方式(半伪代码):
for (int i = 1; i <= n; i++) {
Button b = new Button();
b.Caption = "Value " + n; // non-WPF: b.Text = "Value " + n;
b.Click += (sender, event) => {
someFunction(i);
}
}
让我感到困扰的是,当我单击第一个按钮 (B1) 时,使用someFunction(i) 上的调试器,它告诉我它正在调用someFunction(n + 1)。
我不确定这是为什么,或者如何解决。我使用的解决方法是使用someFunction(i),而不是someFunction(int.Parse(i.ToString())(创建i 的副本)。但这对我来说似乎很可疑,因为整数应该是值类型。
【问题讨论】:
-
您刚刚发现了闭包的工作原理! :-) en.wikipedia.org/wiki/Closure_%28computer_science%29
标签: c# delegates parameter-passing lambda