VB.NET用于循环函数范围与块范围

TKT*_*KTS 7 vb.net scope

给定下面的代码示例,似乎变量currOn在循环之外被提升并且仅实例化一次.例如,假设itemList第二次迭代SomeFunctionThatDoesSomeStuff返回中有三个项目true.currOn那么价值就是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
Run Code Online (Sandbox Code Playgroud)

作为另一个例子,显式设置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
Run Code Online (Sandbox Code Playgroud)

вʀa*_*ᴎєƞ 6

For循环中声明变量时,您在块范围内声明它.已在块中声明的对象只能在该块中访问,但在整个过程中将具有生命周期.

来自MSDN:

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

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