2013-09-27 10 views
7

non riusciva a capire se questo è un insetto o una caratteristicavariabile dichiarata all'interno di un ciclo conserva valore attraverso ogni iterazione del ciclo

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

ho pensato che dichiarando la stringa all'interno del ciclo, esso wouldn 'mantenere il suo valore ma dopo aver eseguito questo codice la console ha 5 righe di "valore di test". Se invece mi dichiaro strTest come:

Dim strTest As String= "" 

Poi la stringa non mantiene a valore che è come mi sarei aspettato la funzione di operare in primo luogo.

È questo comportamento intenzionale del compilatore?

risposta

6

"spezzato come progettato"

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

Nota Anche se la portata di una variabile è limitata ad un blocco, la sua durata è ancora quello di tutta la procedura. Se si inserisce il blocco più volte durante la procedura, ciascuna variabile di blocco mantiene il valore precedente . Per evitare risultati imprevisti in questo caso, è opportuno che inizializzi le variabili di blocco all'inizio del blocco.

Il "blocco" qui è il corpo se il ciclo FOR, e lo si sta inserendo un pr. iterazione del ciclo. E così strTest manterrà il valore impostato nella prima iterazione ("valore di prova") per le successive iterazioni (1, 2, 3, 4).

+0

Se ritieni che questo è un comportamento imprevisto, sono pienamente d'accordo, ma si può sostenere che si tratta di un'opportunità per micro-ottimizzare le prestazioni. L'istruzione DIM in realtà assegna solo memoria qui, quindi dato un compilatore abbastanza buono, è praticamente gratuito (un no-op). Se implicasse un'inizializzazione, costerebbe almeno un op pr. iterazione. –

4

È un comportamento ben specificato. Dalla sezione 10.9 del VB 11 specification:

Ogni volta che viene inserito un corpo del ciclo, una nuova copia è fatta di tutte le variabili locali dichiarate in quel corpo, inizializzati ai valori precedenti delle variabili. Qualsiasi riferimento a una variabile all'interno del corpo del loop utilizzerà la copia creata più recentemente.

Si noti che il fatto che si tratti di una "nuova copia" è potenzialmente importante se si utilizzano espressioni lambda che catturano la variabile locale. Da più avanti nella stessa sezione:

E quando viene creata una lambda, ricorda qualsiasi copia di una variabile era attuale al momento della creazione.

(C'è un esempio che chiarisce che.)

Problemi correlati