如果这是一个错误或功能
,我无法解决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= ""
然后字符串不会保持其值 - 这就是我期望函数首先运行的方式。
这是编译器的故意行为吗?
答案 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时,它会记住变量的任何副本在创建时是最新的。
(有一个例子说明了这一点。)