循环内声明的变量通过循环的每次迭代维护值

5up*_*dan 7 .net vb.net for-loop

如果这是一个错误或功能,我无法解决

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

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

Dim strTest As String= ""
Run Code Online (Sandbox Code Playgroud)

然后字符串不保持其值 - 这就是我期望函数首先运行的方式.

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

And*_*sen 7

"按设计破碎"

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

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

这里的"块"是FOR循环的主体,并且你输入一个pr.循环的迭代.因此strTest将保留第一次迭代中设置的值("测试值")以用于下一次迭代(1,2,3,4).


Jon*_*eet 5

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

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

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

并且当 lambda 被创建时,它会记住变量的哪个副本在创建时是当前的。

(有一个例子可以澄清这一点。)