3

请看下面的代码:

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

tc在 FOR 循环的每次迭代中都会创建一个新对象(称为),因此tc.TestProperty总是如此1。为什么变量不是这种情况,kk每次迭代时递增的值?我意识到这可能与如何处理值类型和引用类型有关,但我想检查一下。

4

4 回答 4

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
于 2013-02-15T01:59:39.120 回答
0

“Dim k As Integer”实际上并没有翻译成任何代码,除了“空间保留”(肯定是在编译时进行的)。所以应用程序没有通过该句子 10 次。

作为证据,您不能在该代码行上添加跟踪项目符号!

另一方面,您的代码在每个循环上创建一个新的对象 TestClass(保存一个全新的变量“TestProperty”)并将其分配给变量“tc”。之前的对象会丢失,并且很快就会收集碳水化合物。

于 2012-07-31T07:37:36.267 回答
0

您必须将Dim k As Integer = 0其保持在 1。

这是因为Dim k As Integer 保留它的值,同时Dim k As Integer = 0“声明和初始化”它。

具体来说:“如果您更改值但随后返回 Dim 语句,则更改后的值将替换为 Dim 语句中提供的值。”

实际上,我不知道为什么它似乎没有超出范围。也许没有New关键字它使用相同的内存块。

于 2012-07-30T06:43:56.377 回答
0

正如这个问题的标题所暗示的,您正在查询范围与变量的生命周期。

局部变量的作用域ktcFor循环。一生就是整个Sub

如果您将 调整tc = New TestClassIf tc Is Nothing Then tc = New TestClass(并忽略了导致的警告),那么您也应该看到tc.TestProperty增量。

于 2012-07-31T07:24:47.190 回答