【发布时间】:2012-11-07 09:29:05
【问题描述】:
我正在检查 VB.NET 中变量声明的位置是否无关紧要,除了范围(this question),我想我最好检查一下当它们被“提升”到闭包中时会发生什么。我没有阅读规范,但我无法解释这些结果:
Dim outer As Integer
For i = 1 To 2
Dim inner As Integer
Try
Dim inner2 As Integer
Do
Dim inner3 As Integer
Call Sub()
Dim inner4 As Integer
Console.WriteLine(outer & ", " & inner & ", " & inner2 & ", " & inner3 & ", " & inner4)
outer = i
inner = i
inner2 = i
inner3 = i
inner4 = i
End Sub()
Loop Until True
Finally
End Try
Next
以上输出:
0, 0, 0, 0, 0
1, 1, 0, 1, 0
inner4 每次都被重置是有意义的,其他innerX 全部或不重置,但为什么只有inner2?!
【问题讨论】:
-
Call Sub() 究竟做了什么?
-
@AhmadAl-Mutawa 足够公平的问题。扩展版是
Dim closure = Sub()...End Sub : closure(),我已经测试过了,结果是一样的。 -
我认为
inner3比inner2更有趣。我认为应该是 0。 -
@Damien_The_Unbeliever 是的,鉴于
inner2已重置,我绝对不明白为什么inner3没有。显然Try是“特殊的”,这就是inner和inner2之间存在差异的原因。我还在For循环之外测试了Try,并且在那里声明的变量具有与outer相同的行为。