2012-07-30 41 views
3

请看看下面的代码:.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 

有上的每一个迭代循环创造了一个新的对象(被称为tc),所以tc.TestProperty总是1。为什么变量k的情况并非如此,即每次迭代时k的值增加1?我意识到这可能与如何处理值类型和引用类型有关,但我想检查。

+0

因为你没有'k'到'k + 1'的初值。你将它初始化为“i + 1”。 – CodesInChaos 2012-07-30 06:34:11

+0

@CodesInChaos,我已将i + 1更改为k + 1。 – w0051977 2012-07-30 06:36:37

+0

好吧,通过这个编辑,我现在对你编辑的 – 2012-07-30 06:36:55

回答

0

你将不得不Dim k As Integer = 0使其保持在1

这是因为Dim k As Integerretains it's value,而Dim k As Integer = 0“声明并初始化”它。

具体而言:“如果更改该值但返回到Dim语句,则更改后的值将由Dim语句中提供的值替换。”

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

+0

Thnaks 。我不明白你的意思是什么:“如果你改变了这个值,但是返回到了Dim语句,你修改后的值将被Dim语句中提供的值替换。” – w0051977 2012-07-30 19:22:08

0

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

局部变量ktc的范围是内部For循环。整个使用期限为Sub

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

0

“Dim k As Integer”实际上并没有翻译成除“space reservation”之外的任何代码(这肯定是在编译时做出的)。所以应用程序不会传递这个句子10次。

作为证明,你不能把跟踪项目符号在该行的代码!另一方面,您的代码在每个循环上创建一个新的新对象TestClass(持有一个全新的变量“TestProperty”)并将其赋值给变量“tc”。之前的对象丢失并且不久之后收集carbage。

1

这是因为当事情被定义为块级它应用于整个块级别,无论循环。通常与喜欢的范围开始和结束,并没有行代码重复的IF语句块控制逻辑。

内一个循环结构变量是在该块内部定义的,即使Dim语句似乎被多次调用它不是,它实际上并不是一个可执行语句(只是一个de如上所述在一个评论中定义和保留占位符)

要使它的行为方式与“tc”相同,您还需要以类似的方式初始化它。如果你改变(赋值为0会出现每个循环,而不是定义)

Dim k As Integer = 0 

或者如何您的交易与技术合作,将行为方式为k的地方是块范围内循环的整个时间相同。在下面的例子中,tc并没有重新定义每个循环。

Dim tc as TestClass 
if tc is nothing then tc = New TestClass