编程语言
首页 > 编程语言> > c#-动态生成调用Lambda函数的按钮-可变范围

c#-动态生成调用Lambda函数的按钮-可变范围

作者:互联网

我遇到的情况是我拥有someFunction(int),并且我需要以编程方式生成n个将调用它的按钮.这意味着我要创建单击时调用someFunction(1),someFunction(2),… someFunction(n)的按钮B1,B2,… Bn.

这是我尝试执行此操作的方式(半伪代码):

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(int.Parse(i.ToString())代替someFunction(i)(创建i的副本),但是这对我来说似乎很可疑,因为整数应该是值类型.

解决方法:

我相信您了解为什么会这样.问题在于它捕获变量i本身,而不是其值.对我来说似乎更好的解决方法(没有toString和int.parse)是声明另一个复制我的本地变量

for (int i = 1; i <= n; i++) {
Button b = new Button();
  b.Caption = "Value " + n; // non-WPF: b.Text = "Value " + n;
  int locali = i;
  b.Click += (sender, event) => {
    someFunction(locali);
  }
}

这样,捕获的变量将是locali,并且在整个循环中将保持不变.

标签:parameter-passing,delegates,c,lambda
来源: https://codeday.me/bug/20191208/2091494.html