考虑以下代码:

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对象,对吗?

最佳答案

这是预期的行为。

正如您在对另一个答案的评论中提到的那样,使用整数而不是字符串连接可能更容易看到:

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的旧内容)。

关于vb.net - VB.NET中块级变量的范围是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14766144/

10-10 01:25