我正在制作一个循环来制作一个定时器数组并为每个定时器提供一个函数
这就像我做的那样:
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()
即使我将参数更改为从6
到1
5
为什么会这样?
答案 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
的新实例。