2016-12-31 85 views
1

我在這裏完全失敗......邏輯似乎設置正確,但while語句中的「響應」表示它在當前上下文中不存在。我在這裏搜索,似乎在這方面找到了同樣的問題。問題是否轉化爲方法?在一個範圍(一般一組括號{ ... }的)宣佈從聲明中接收用戶輸入

do 
     { 
      Console.WriteLine("enter a number between 1 and 5"); 
      int x = Convert.ToInt32(Console.ReadLine()); 

      Random r = new Random(); 
      int rr = r.Next(1, 5); 
      Console.WriteLine("Do you want to continue? Please select yes or no."); 
      string response = Convert.ToString(Console.ReadLine()); 
     } while (response == "yes"); 
+5

您在循環內部聲明瞭'response',這就是它存在的地方通常,新的縮進級別會創建一個新的塊範圍..您可能還想爲整個循環創建一個隨機實例,而不是每次迭代 – Plutonix

+2

如果你在循環內部定義了'response',它應該如何在它外面檢查它?你必須定義'字符串response'前環 – UnholySheep

+1

響應確實超出{}範圍不可見,聲明它之前做 –

回答

6

變量不是該範圍的可訪問的外部。您已在內聲明response循環。您需要在循環之外聲明response

你也想比較它,使用前String.Trim()從字符串修剪空白。否則,最後會出現換行符(\n),導致比較失敗。

string response; 

do { 
    //... 

    response = Console.ReadLine().Trim(); 
} while (response == "yes"); 
1

您的響應變量不在循環的上下文中。只需將變量聲明如下外循環:

 string response = String.Empty; 

     do 
     { 
      Console.WriteLine("enter a number between 1 and 5"); 
      int x = Convert.ToInt32(Console.ReadLine()); 

      Random r = new Random(); 
      int rr = r.Next(1, 5); 
      Console.WriteLine("Do you want to continue? Please select yes or no."); 
      response = Convert.ToString(Console.ReadLine()); 
     } while (response == "yes"); 
+2

這個答案是什麼添加,這還沒有說明? –

+1

無需爲每次迭代創建一個新的隨機;這是一個壞習慣。不需要Convert.ToString – Plutonix

+0

@Plutonix - 你是對的,但只有在大括號內部使用的局部變量應該在大括號內聲明,以限制範圍。編譯器非常聰明,可以使其儘可能高效。 – Joe

0

可能有助於封裝這個有點。如何:

static void Main(string[] args) 
    { 
     Random rand = new Random(); 
     do 
     { 
      Write("enter a number between 1 and 5"); 
      string response = Console.ReadLine(); 
      int x = 5; 
      if (Validate(response, "1-5")) int.TryParse(response, out x);     
      Write(rand.Next(0,x)); 
      Write("Do you want to continue? Please select yes or no.");     
     } while (Validate(Console.ReadLine().ToLower(), "yes")); 
    } 
    static void Write(string s) => Console.WriteLine(s); 
    static bool Validate(string s, string Pattern) => Regex.Match(s, Pattern).Success; 
+0

每次你想要一個隨機數時創建一個新的Random對象是不正確的。 –

+0

我希望你們投票支持所有其他人,因爲我只使用他們提供的代碼。無論如何,我會糾正它,即使這對處理時間或內存沒有影響,因爲GC應該收集這些數據,因爲它超出範圍,每個呼叫和系統空閒等待用戶響應並根據需要進行處理。 –

+0

我確實相信你是不正確的,即使我相信我遇到了你的建議。遵循適當的面向對象,將隨機化封裝成像我一樣的方法會更好。循環應儘可能保持乾淨,因爲它的目的是收集用戶輸入,輸入的處理應該在別處處理。對每個方法的調用創建一個新的Random是可以的,但不能在循環內部創建,因爲這會阻止GC進行收集,因爲引用永遠不會被釋放。然而,在它自己的方法中,它們將隨着每次調用和返回值而被釋放。 –