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

时间:2013-09-27 10:42:45

标签: .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

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

Dim strTest As String= ""

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

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

2 个答案:

答案 0 :(得分:7)

"按设计破坏"

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

  

注意即使变量的范围仅限于块,也可以   寿命仍然是整个程序的寿命。如果您输入该块   在程序中不止一次,每个块变量都保留了它   以前的价值。为避免在这种情况下出现意外结果,这是明智之举   在块的开头初始化块变量。

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

答案 1 :(得分:4)

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

  

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

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

  

当创建一个lambda时,它会记住变量的任何副本在创建时是最新的。

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