将参数从循环值传递给动态函数

时间:2017-07-26 03:14:13

标签: vb.net visual-studio-2012

我正在制作一个循环来制作一个定时器数组并为每个定时器提供一个函数

这就像我做的那样:

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

但我得6为每个timerNo i调用timer的值:

timer(3).Start()

即使我将参数更改为从61

的数字,我也输出5

为什么会这样?

1 个答案:

答案 0 :(得分: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的新实例。