2013-04-03 7 views
5

C# zadanie domowe: Właśnie dodałem trochę logiki "zagraj ponownie" za pomocą pętli do-while. To był mój oryginalny kod:W jaki sposób zakres wpływa na pętle "do ... while" i na odwrót?

namespace demo 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Info myInfo = new Info(); 
      myInfo.DisplayInfo("Daniel Wilson", "4 - Hi-Lo Game"); 
       // I moved String playAgain = "N"; to here 
      do 
      { 
       DWHiLowUI theUI = new DWHiLowUI(); 
       theUI.Play(); 
       String playAgain = "N"; 
       Console.WriteLine("Enter 'Y' to play again, any other key to exit."); 
       playAgain = Console.ReadLine(); 
      } 
      while ((playAgain == "Y")||(playAgain =="y")); 
      Console.ReadLine(); 
     } 
    } 
} 

który dał mi błąd:

Error 7 The name 'playAgain' does not exist in the current context 

przeniosłem String playAgain = "N"; do linii nad moją do (patrz komentarz) i to działało dobrze.

Próbuję zrozumieć, co dokładnie I zrobił, aby to naprawić. Wygląda na to, że był to problem zakresu, ale wydaje mi się również, że zdefiniowanie zmiennej w pętli może spowodować przekazanie jej na koniec pętli. Przejrzałem moje podręczniki i nie ma nic o zakresie, który dotyczy pętli. Sugerowałoby mi to, że zakres w pętlach nie jest problemem, ale zachowuje się tak, jakby był to problem zakresu. Myliłem się, myśląc o tym.

Jeśli to był problem zakresu chciałbym mieć lepsze zrozumienie zakresu do...while pętli w ramach metody. Jeśli to było nie było problem zakresu, to był szczęśliwy z mojej strony. W takim razie, co było nie tak i jak udało się to zmienić w tym wierszu kodu?

Odpowiedz

7

Masz rację, jest to problem dotyczący zakresu. C# ma zakres blokowy, co oznacza, że ​​zmienne zadeklarowane wewnątrz bloku (kod zadeklarowany pomiędzy {}) są dostępne tylko wewnątrz tego bloku (i bloków potomnych).

Ponieważ playAgain jest zdefiniowany wewnątrz korpusu pętli, nie jest dostępny poza tym blokiem, nawet w obrębie wyrażenia while.

5

Tak, to był problem z zasięgiem. Zakres około do..czasu działa tak jak podążanie za

// outer scope 
do 
{ 
    // inner scope 
} while (/*outer scope*/); 
// outer scope 
2

Aby dodać na. Każda iteracja pętli niszczy zmienne zdefiniowane w tym bloku, więc gdy jesteś w stanie, ocena, która znajduje się poza blokiem, nie wie, co to jest playAgain, które jest zdefiniowane w kontekście wewnętrznym.

Powiązane problemy