3

考虑以下代码:

For i As Integer = 0 To 10
   Dim str As String = str & " Kratika "
Next

当我附加调试器并检查 at 的值stri = 10,我看到以下内容:

 Kratika  Kratika  Kratika  Kratika  Kratika  Kratika  Kratika  Kratika  Kratika  Kratika  Kratika 

为什么要连接前一个值?我希望每次都将变量设置为kratika,因为每次它都会声明一个新的 String 对象,对吧?

4

2 回答 2

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)。

于 2013-02-08T05:49:15.760 回答
0

嗨,你已经在循环内使用str & " Kratika "了。如果你只期望 " Kratika "每次都只Dim str As String = " Kratika "在循环内使用。

现在再次检查

于 2013-02-08T05:19:05.507 回答