【问题标题】:pass parameter from loop value to dynamic function将参数从循环值传递给动态函数
【发布时间】:2017-07-26 03:14:13
【问题描述】:

我正在循环创建一个定时器数组并给每个定时器一个函数

这是我所做的:

dim timer(10) as Timer
for i = 0 to 5
timer(i) = new Timer
AddHandler timer(i).Tick, Function(senderX, eX) timerFunction(i)
next

我有这个功能:

Private Function timerFunction(ByVal timerNo As Integer)
    MsgBox(timerNo)
End Function

但是对于我用这个调用的每个timer,我都会得到6 作为timerNo 的值:

timer(3).Start()

即使在我将参数更改为从15 的数字时,我也会输出6

为什么会这样?

【问题讨论】:

  • timerFunctiontimerNo 值是在调用函数时计算的,而不是在您执行 AddHandler 时计算的。见ericlippert.com/2009/11/12/…
  • 你应该得到一个编译器警告:“BC42324 在 lambda 表达式中使用迭代变量可能会产生意想不到的结果。相反,在循环中创建一个局部变量并为其分配迭代变量的值。 "

标签: vb.net visual-studio-2012


【解决方案1】:

您已经“关闭了循环变量”。 timerNo 的值是在函数调用时计算的,总是在循环完成之后,所以timerNo 的值总是 6。

您应该收到编译器警告:“BC42324 Using the iteration variable in a lambda expression may have unexpected results. Instead, create a local variable within the loop and assign it the value of the iteration variable.

用你的例子来做到这一点......

Dim timer(10) As Timer
For i As Integer = 0 To 5
  Dim j As Integer = i
  timer(i) = New Timer
  timer(i).Interval = 1000
  timer(i).Enabled = True
  AddHandler timer(i).Tick, Function(senderX, eX) timerFunction(j)
Next

Function timerFunction(timerNo As Integer) As String
  MsgBox(timerNo)
  Return timerNo.ToString
End Function

这样,每次循环迭代都会创建一个 j 的新实例。

【讨论】:

  • 谢谢!我已经通过使用 Dim index As Integer = Array.IndexOf(timer, CType(sender2, System.Windows.Forms.Timer)) 获得了解决方案,但真的很感谢你。我会环顾四周,也许会使用它。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 2015-11-10
  • 1970-01-01
  • 2010-12-15
  • 2012-07-30
  • 2012-04-26
  • 2021-03-13
相关资源
最近更新 更多