2015-09-16 9 views
6

Dato il codice di esempio riportato di seguito, sembra che la variabile currOn sia stata sollevata all'esterno del ciclo e creata solo una volta. Ad esempio, diciamo che ci sono tre articoli in itemList e nella seconda iterazione SomeFunctionThatDoesSomeStuff restituisce true. Il valore di currOn sarà quindi true. Sulla terza iterazione, avrei pensato che dato VB.NET è un linguaggio a portata di blocco che currOn verrebbe riattivato e predefinito su false; tuttavia, vedo che rimane true e quindi non importa il valore di sOn, non viene aggiornato in ulteriori iterazioni. Sembra l'ambito delle funzioni di javascript in cui la dichiarazione di currOn verrebbe visualizzata all'esterno del ciclo. Qualcuno sa cosa sta succedendo qui?VB.NET Per funzione di ciclo scope vs scope scope

 For Each item As MyItem In itemList 
      Dim currOn As Boolean 
      Dim sOn As Boolean = SomeFunctionThatDoesStuff(item) 
      currOn = currOn OrElse sOn 

      Debug.Print(String.Format("the value of currOn is: {0}", currOn)) 
     Next 

Come ulteriore esempio, impostando in modo esplicito currOn = false ogni iterazione sembra funzionare come mi sarei aspettato quanto sopra per lavorare.

  For Each item As MyItem In itemList 

       Dim currOn As Boolean = False 
       Dim sOn As Boolean = SomeFunctionThatDoesStuff() 
       currOn = currOn OrElse sOn 

       Debug.Print(String.Format("the value of currOn is: {0}", currOn)) 
      Next 
+1

Molto interessante, perché se si ha il codice di fuori di un ciclo e solo ripetuto manualmente, si otterrebbe un errore di compilazione a causa di duplicare dichiarazione di una variabile nello stesso ambito - Il fatto che ci sia solo una riga deve significare che il compilatore la legge solo una volta e lo contrassegna come codice 'legale', indipendentemente dal fatto che il processo venga duplicato. –

+0

Anche questo mi sorprende. Probabilmente questo è per assicurarsi che le porte del codice VB6 migliori. – GSerg

+0

Interessante ... forse qualcosa a che fare con le opzioni VB.NET? Si noti che i due campioni di codice non sono esattamente gli stessi - il secondo ha un loop interno. Sarei curioso di vedere il comportamento se si inizializza 'currOn' su" False "all'inizio di ogni ciclo nel primo esempio. – Tim

risposta

5

Quando si dichiara una variabile all'interno di un ciclo For si dichiara che all'interno di un ambito blocco. Gli oggetti che sono stati dichiarati all'interno di un blocco saranno accessibili solo all'interno di quel blocco ma avranno una vita intera attraverso l'intera procedura.

Da MSDN:

Anche se la portata di una variabile è limitato ad un blocco, la sua durata è ancora quella di tutta la procedura. Se si inserisce il blocco più di una volta durante la procedura, ciascuna variabile di blocco mantiene il valore precedente. Per evitare risultati imprevisti in questo caso, è consigliabile inizializzare le variabili di blocco all'inizio del blocco.

MSDN Link: https://msdn.microsoft.com/en-us/library/1t0wsc67.aspx