2013-02-08 74 views
3

考慮下面的代碼:VB.NET中塊級變量的作用域是什麼?

For i As Integer = 0 To 10 
    Dim str As String = str & " Kratika " 
Next 

當我附加調試和i = 10檢查str的價值,我看到以下內容:

Kratika Kratika Kratika Kratika Kratika Kratika Kratika Kratika Kratika Kratika Kratika 

爲什麼串聯以前的值?我期望這個變量每次都被設置爲kratika,因爲每次它都會聲明一個新的String對象,對吧?

回答

4

這是預期的行爲。

正如你在另一個答案評論提到,它可能更容易看到使用整數,而不是字符串連接:

Sub Main() 
    For i As Integer = 0 To 5 
    Dim j As Integer = j + 1 
    Console.WriteLine(j.ToString()) 
    Next 
End Sub 

輸出如下:

1 
2 
3 
4 
5 
6 

要了解爲什麼,我們轉向文檔,特別是關於scope的部分。您聲明的j變量爲範圍範圍,因爲它在For塊內聲明。但是,在塊範圍內聲明的變量在其包含過程的整個持續時間內仍保留其值。正如文檔中所述:

即使變量的作用域限於塊,它的生命週期仍然是整個過程的範圍。如果在該過程中多次輸入該塊,則每個塊變量將保留其先前的值。爲了避免在這種情況下出現意外結果,在塊的開始處初始化塊變量是明智的。

那麼是什麼情況是,每次的時間重新進入For塊,j仍然有其先前的值。因爲首先評估等號的右側,那麼舊值j會增加1,然後存儲在j(有效擦除j的舊內容)。

+0

@CodeGray你會請回顧這篇文章http://stackoverflow.com/questions/14937392/object-of-interop-word-document-class-is-null-on-windows-server-2008-word-open – vikas

0

嗨,你已經使用str & " Kratika "裏面的循環。如果你只期望" Kratika "每次然後在循環內部只使用Dim str As String = " Kratika "

現在再次檢查

+0

謝謝你的回覆我的疑問是爲什麼它添加字符串'kratika' – vikas

+0

因爲你使用&運算符的以前的值。 – user2001117

+0

好的,但我也在for循環中聲明每次正確的 – vikas

相關問題