.NET - 块级范围

时间:2012-07-30 06:31:24

标签: vb.net

请查看以下代码:

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?我意识到这可能与处理值类型和引用类型的方式有关,但我想检查一下。

4 个答案:

答案 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)

正如这个问题的标题暗示的那样,你要查询范围与变量的生命周期。

局部变量ktc的范围是内部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>