VB.NET用于循环功能范围与块范围

VB.NET用于循环功能范围与块范围,vb.net,scope,Vb.net,Scope,给定下面的代码示例,变量currOn似乎在循环之外被提升,并且只实例化一次。例如,假设在itemList中有三个项,在第二次迭代中somefunctionthat doessomestuff返回true。然后,currOn的值将为true。在第三次迭代中,我会认为给定的VB.NET是一种块作用域语言,currOn将被重新实例化并默认为false;但是,我看到它仍然是true,因此无论sOn的值如何,都不会在进一步的迭代中更新。它似乎是javascript的函数范围,其中currOn的声明将被拉到

给定下面的代码示例,变量
currOn
似乎在循环之外被提升,并且只实例化一次。例如,假设在
itemList
中有三个项,在第二次迭代中
somefunctionthat doessomestuff
返回
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
再举一个例子,显式地设置
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

For
循环中声明变量时,您是在块范围内声明它。在块中声明的对象将仅在该块中可访问,但在整个过程中具有生存期

从MSDN:

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


MSDN Link:

非常有趣,因为如果您将代码从循环中取出并手动重复它,您将由于在同一范围内重复声明变量而得到编译错误-事实上只有一行必须意味着编译器只读取一次并将其标记为“合法”代码,不管事实如何,这个过程将会重复。这也让我感到惊讶。可能这是为了确保VB6代码端口更好。有趣的…可能与VB.NET选项有关?请注意,这两个代码示例并不完全相同-第二个示例有一个内部循环。在第一个示例中,如果在每个循环的开头将
currOn
初始化为“False”,我会很好奇地看到这种行为。这非常有趣。除非添加赋值,否则代码不会再次通过Dim。当添加赋值时,代码会在整个行中运行,但它不会在循环顶部重新分配变量,而只是重置它们的值。很好的发现。@Tim谢谢你指出这一点。实际上,我并不是想在第二个示例中包含第二个循环。我发现发生这种情况的代码要复杂得多,但我发现它只发生在一个简单的示例中。我将对其进行编辑以使其更清晰。