2013-09-27 67 views
7

我不能工作了,如果這是一個錯誤或功能通過循環的每個迭代保值

For i = 0 To 4 
    Dim strTest As String 
    If i = 0 Then 
     strTest = "test value" 
    End If 
    Console.WriteLine(strTest) 
Next 

我認爲通過聲明循環內的字符串,它止跌沒有保持它的價值,但在運行這個代碼後,控制檯有5行「測試值」。相反,如果我宣佈strTest,如:

Dim strTest As String= "" 

然後字符串不保持其價值 - 這是多麼我本來期望的功能,在第一時間進行操作。

這是編譯器的這種故意行爲嗎?

回答

6

「破作爲設計的」

http://msdn.microsoft.com/en-us/library/1t0wsc67.aspx

注意即使一個變量的範圍被限制在一個塊時,其壽命 仍是整個過程的。如果在該過程中多次輸入塊 ,則每個塊變量將保留其以前的值 。爲了避免在這種情況下出現意外的結果,明智的 在塊的開始處初始化塊變量。

這裏的「block」是主體,如果FOR循環,並且你正在輸入一個pr。循環迭代。因此,strTest將保留第一次迭代(「測試值」)中爲下一次迭代(1,2,3,4)設置的值。

+0

如果你覺得這是意外的行爲,我完全同意,但可以認爲它是微優化性能的機會。 DIM語句實際上只在這裏分配內存,所以給定一個足夠好的編譯器,它實際上是免費的(一個無操作)。如果它意味着一個初始化,它將至少花費一個操作。迭代。 –

4

這是很好的行爲。從VB 11 specification第10.9:

每次進入循環體的時候,一個新的副本是由該機構聲明的所有局部變量,初始化變量的先前值。對循環體內的變量的任何引用都將使用最近創建的副本。

請注意,如果使用捕獲局部變量的任何lambda表達式,則它是「全新副本」的事實可能很重要。從同一部分的後面開始:

當創建一個lambda時,它會記住變量在創建時的最新版本。

(有由此可知一個例子。)