2012-07-30 52 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