c# - 动态生成调用 Lambda 函数的按钮——变量作用域

标签 c# delegates parameter-passing lambda

我的情况是 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 的副本)。但这对我来说似乎很可疑,因为整数应该是值类型。

最佳答案

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

的本地 var
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 并且它在整个循环中保持不变。

关于c# - 动态生成调用 Lambda 函数的按钮——变量作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5916849/

相关文章:

python - 我可以引用或重用 Python 函数参数作为其他函数参数吗?

c# - EF6 - ExecuteSqlCommandAsync - 获取返回参数(声明标量变量错误)

c# - 在运行时,C# 如何委托(delegate)定义它的访问范围?

c# - 如何使用委托(delegate)和事件处理程序进行用户控制

时间:2019-03-17 标签:c#system.timers内存泄漏

c++ - 在 C++ 中通过文本传递参数

android - 将参数从 Activity 传递到 BroadcastReceiver

c# - 银光反射

c# - 我可以在不发布的情况下在 Skype 上测试使用 MS Bot Framework 制作的机器人吗?

c# - 检查两个 IEnumerable 的计数是否相等