2015-09-16 19 views
6

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 
+1

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. –

+0

To też mnie zaskakuje. Prawdopodobnie jest to, aby upewnić się, że porty kodu VB6 są lepsze. – GSerg

+0

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

Odpowiedz

5

Deklarując zmienną w For pętli jesteś uznającej go w zakresie bloku. Obiekty zadeklarowane w bloku będą dostępne tylko w tym bloku, ale będą miały czas życia w całej procedurze.

Od MSDN:

Nawet jeśli zakres zmiennej jest ograniczony do bloku, jego życie jest nadal, że z całą procedurę. Jeśli wprowadzisz blok więcej niż jeden raz podczas procedury, każda zmienna bloku zachowa poprzednią wartość. Aby uniknąć nieoczekiwanych wyników w takim przypadku, dobrze jest zainicjować zmienne blokowe na początku bloku.

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