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
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. –
Anche questo mi sorprende. Probabilmente questo è per assicurarsi che le porte del codice VB6 migliori. – GSerg
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