VB.NET For循环函数范围vs块范围

时间:2015-09-16 21:55:10

标签: vb.net scope

鉴于下面的代码示例,似乎变量currOn在循环之外被提升并且仅实例化一次。例如,假设itemList中有三个项目,而第二次迭代SomeFunctionThatDoesSomeStuff则返回truecurrOn的值将为true。在第三次迭代中,我认为给定VB.NET是块范围语言,currOn将被重新实例化并默认为false;但是,我发现它仍然是true,因此无论sOn的值如何,都不会在进一步的迭代中得到更新。它似乎是javascript的函数范围,其中currOn的声明将在循环外被拉出。有谁知道这里发生了什么?

        For Each item As MyItem In itemList
            Dim currOn As Boolean
            Dim sOn As Boolean = SomeFunctionThatDoesStuff(item)
            currOn = currOn OrElse sOn

            Debug.Print(String.Format("the value of currOn is: {0}", currOn))
        Next

作为另一个例子,显式设置currOn = false每次迭代似乎都可以正常工作,因为我希望上述工作能够正常工作。

            For Each item As MyItem In itemList

                Dim currOn As Boolean = False
                Dim sOn As Boolean = SomeFunctionThatDoesStuff()
                currOn = currOn OrElse sOn

                Debug.Print(String.Format("the value of currOn is: {0}", currOn))
            Next

1 个答案:

答案 0 :(得分:6)

Couldn't find all Forms with 'id': (193, token) (found 1 results, but was looking for 2)循环中声明变量时,您在块范围内声明它。已在块中声明的对象只能在该块中访问,但在整个过程中将具有生命周期。

来自MSDN:

  

即使变量的范围仅限于块,其寿命仍然是整个过程的寿命。如果在过程中多次输入块,则每个块变量将保留其先前的值。为避免在这种情况下出现意外结果,最好在块的开头初始化块变量。

MSDN链接:https://msdn.microsoft.com/en-us/library/1t0wsc67.aspx