10

我无法确定这是错误还是功能

For i = 0 To 4
    Dim strTest As String
    If i = 0 Then
        strTest = "test value"
    End If
    Console.WriteLine(strTest)
Next

我认为通过在循环内声明字符串,它不会保持其值,但在运行此代码后,控制台有 5 行“测试值”。相反,如果我声明 strTest 如下:

Dim strTest As String= ""

然后字符串不会保持它的值——这就是我最初期望函数运行的方式。

这是编译器的故意行为吗?

4

2 回答 2

10

“按设计破碎”

http://msdn.microsoft.com/en-us/library/1t0wsc67.aspx

注意 即使变量的范围仅限于块,它的生命周期仍然是整个过程的生命周期。如果在过程中多次输入块,则每个块变量都保留其先前的值。为了避免在这种情况下出现意外结果,明智的做法是在块的开头初始化块变量。

这里的“块”是 FOR 循环的主体,并且您正在输入一个 pr。循环的迭代。因此 strTest 将保留在第一次迭代中设置的值(“测试值”)用于下一次迭代(1、2、3、4)。

于 2013-09-27T10:47:09.933 回答
5

这是明确规定的行为。从VB 11 规范的第 10.9 节:

每次进入循环体时,都会对该循环体中声明的所有局部变量进行新副本,并初始化为变量的先前值。对循环体内变量的任何引用都将使用最近制作的副本。

请注意,如果使用任何捕获局部变量的 lambda 表达式,那么它是“新副本”这一事实可能很重要。从稍后在同一部分:

当创建 lambda 时,它会记住创建时当前的变量副本。

(有一个例子可以说明这一点。)

于 2013-09-27T10:50:42.740 回答