Wydaje się, że zmienna currOn
jest podnoszona poza pętlą i zawiera tylko jeden egzemplarz. Na przykład powiedzmy, że istnieją trzy elementy w itemList
, a po drugiej iteracji SomeFunctionThatDoesSomeStuff
zwraca true
. Wartość currOn
będzie wówczas wynosić true
. W trzeciej iteracji pomyślałbym, że biorąc pod uwagę VB.NET jest językiem zakresu blokowego, który zostanie ponownie utworzony i będzie domyślnie ustawiony na currOn
na false
; jednak widzę, że pozostaje on true
i dlatego bez względu na wartość sOn
, nie jest aktualizowany w kolejnych iteracjach. Wydaje się, że zakres funkcji javascripta, gdzie deklaracja currOn
zostanie wyciągnięta poza pętlą. Czy ktoś wie, co się tutaj dzieje?VB.NET Dla zakresów funkcji pętli a zakresów bloków
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
Jako kolejny przykład, jawnie ustawienie currOn = false
każdej iteracji wydaje się działać jak by się było spodziewać wyżej pracować.
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
Bardzo ciekawe, bo jeśli wziął kod z pętli i po prostu powtórzył je ręcznie, co można uzyskać błąd kompilacji z powodu duplikat deklaracji zmiennej w takim samym zakresie - Fakt, że istnieje tylko jedna linia, musi oznaczać, że kompilator odczytuje ją tylko raz i oznacza ją jako "legalny" kod, niezależnie od tego, czy proces zostanie powielony. –
To też mnie zaskakuje. Prawdopodobnie jest to, aby upewnić się, że porty kodu VB6 są lepsze. – GSerg
Interesujące ... może coś wspólnego z opcjami VB.NET? Zwróć uwagę, że dwie próbki kodu nie są dokładnie takie same - druga ma wewnętrzną pętlę. Byłbym ciekawy zobaczyć zachowanie, jeśli zainicjujesz 'currOn' na" False "na początku każdej pętli w pierwszym przykładzie. – Tim