请查看以下代码:
Public Class TestClass
Public TestProperty As Integer
End Class
Public Class Form1
Private Sub Form1_Load(ByVal sender As Object,
ByVal e As System.EventArgs) Handles Me.Load
Dim i As Integer
Dim j As Integer
For j = 0 To 2
For i = 0 To 10
Dim k As Integer
Dim tc As TestClass
tc = New TestClass
tc.TestProperty = tc.TestProperty + 1
k = k + 1
Next
Next
End Sub
End Class
在FOR循环的每次迭代中都创建了一个新对象(称为tc
),因此tc.TestProperty
始终为1
。为什么变量k
不是这种情况,即k
的值在每次迭代时递增1?我意识到这可能与处理值类型和引用类型的方式有关,但我想检查一下。
答案 0 :(得分:1)
这是因为当某些东西被定义为块级别时,无论循环如何,它都适用于整个块级别。通常使用像IF块语句这样的控制逻辑,范围开始和结束,没有代码行重复。
在循环结构中,变量是在该块内部定义的,即使Dim语句似乎被多次调用,它实际上也不是可执行语句(只是上面提到的占位符的定义和保留)一条评论)
要使其行为与“tc”相同,您还需要以类似的方式初始化它。 (每次循环都会发生0的赋值,而不是定义)
Dim k As Integer = 0
或者,如果你改变处理tc的方式,它的行为方式与k在块范围内的行为相同,整个循环内部的时间。在下面的例子中,tc没有重新定义每个循环。
Dim tc as TestClass
if tc is nothing then tc = New TestClass
答案 1 :(得分:0)
您必须Dim k As Integer = 0
才能将其保持为1。
这是因为Dim k As Integer
retains it's value,而Dim k As Integer = 0
“声明并初始化”。{/ p>
具体来说:“如果您更改了值,但随后返回Dim语句,则您更改的值将替换为Dim语句中提供的值。”
实际上,我不知道为什么它似乎没有超出范围。也许没有New
关键字,它使用相同的内存块。
答案 2 :(得分:0)
正如这个问题的标题暗示的那样,你要查询范围与变量的生命周期。
局部变量k
和tc
的范围是内部For
循环。生命周期是整个Sub
。
如果您将tc = New TestClass
调整为If tc Is Nothing Then tc = New TestClass
(并忽略了导致的警告),那么您应该也会看到tc.TestProperty
增量。
答案 3 :(得分:0)
“Dim k As Integer”实际上并没有转换成除“空间预留”之外的任何代码(这肯定是在编译时进行的)。因此,该应用程序不会传递该句子10次。
作为证明,您无法在该行代码上添加跟踪项目符号!
另一方面,你的代码在每个循环上创建一个新的新对象TestClass(持有一个全新的变量“TestProperty”)并将其分配给变量“tc”。前一个对象丢失并且很快就会收集carbage。 / p>