在VB.NET中,块级变量的作用域是什么?

3
考虑下面的代码:

考虑下面的代码:

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

当我连接调试器并在i=10时检查str的值,我看到如下:

 Kratika  Kratika  Kratika  Kratika  Kratika  Kratika  Kratika  Kratika  Kratika  Kratika  Kratika 

为什么它会将之前的值连接起来?我本以为每次都会声明一个新的String对象,所以期望变量每次都被设置为“kratika”,对吗?
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的旧内容)。

@CodeGray,您能否请您审核一下这篇文章:http://stackoverflow.com/questions/14937392/object-of-interop-word-document-class-is-null-on-windows-server-2008-word-open - vikas

0

嗨,你在循环中使用了str & " Kratika "。如果你每次只期望得到" Kratika ",那么就只需要在循环内部使用Dim str As String = " Kratika "

现在再次检查一下。


谢谢回复。我的疑问是为什么它会添加字符串“kratika”的先前值。 - vikas
是的,但是如果你声明使用 & 运算符,它总是与先前的值连接起来。 - user2001117
Dim str As String = "Kratika" 声明字符串变量str并将其赋值为“Kratika”。 - user2001117
如果我在“for循环”内使用Dim j As Integer = j + 1,那么我应该期望什么? - vikas
如果您已经赋值 j = 1,则应该是 1、2、3 等。 - user2001117
他已经知道发生了什么。在提问之前,他在调试器中运行并检查了它(这很好)。他在这里询问的是为什么会发生这种情况。 - Cody Gray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接