请考虑以下代码:
For i As Integer = 0 To 10
Dim str As String = str & " Kratika "
Next
当我附加调试器并在str
检查i = 10
的值时,我会看到以下内容:
Kratika Kratika Kratika Kratika Kratika Kratika Kratika Kratika Kratika Kratika Kratika
为什么要连接之前的值?我希望每次变量都设置为kratika
,因为每次它都会声明一个新的String对象,对吗?
答案 0 :(得分:4)
这是预期的行为。
正如您在对另一个答案的评论中提到的那样,使用整数而不是字符串连接可能更容易看到:
Sub Main()
For i As Integer = 0 To 5
Dim j As Integer = j + 1
Console.WriteLine(j.ToString())
Next
End Sub
输出如下:
1
2
3
4
5
6
要了解原因,请转到文档,特别是scope部分。您声明的j
变量位于块范围内,因为它是在For
块内声明的。但是,在块作用域中声明的变量在其包含过程的整个持续时间内仍保留其值。正如文档中的说明所示:
即使变量的范围仅限于块,其寿命仍然是整个过程的寿命。如果在过程中多次输入块,则每个块变量将保留其先前的值。为避免在这种情况下出现意外结果,最好在块的开头初始化块变量。
所以发生的事情是,每次重新输入For
块时,j
仍然具有其先前的值。因为首先评估等号的右侧,所以j
的旧值增加1,然后存储在j
中(有效地删除j
的旧内容)。
答案 1 :(得分:0)
嗨,你在循环中使用str & " Kratika "
。如果你每次只期望" Kratika "
那么在循环中只使用Dim str As String = " Kratika "
。
现在再次检查