C# 从do while语句接收用户输入

C# 从do while语句接收用户输入,c#,do-while,C#,Do While,我在这里完全不知所措。。。逻辑似乎设置正确,但while语句中的响应表示它在当前上下文中不存在。我在这里搜索,似乎在这里找到了相同的问题。这个问题是解决方法的问题吗 do { Console.WriteLine("enter a number between 1 and 5"); int x = Convert.ToInt32(Console.ReadLine()); Random r = new

我在这里完全不知所措。。。逻辑似乎设置正确,但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");

在一个范围内声明的变量通常是一组大括号{…},在该范围外是不可访问的。您已经在循环中声明了响应。您需要在循环之外声明响应

在比较字符串之前,还需要使用。否则,结尾将有一个换行符\n,导致比较失败

string response;

do {
    //...

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

在一个范围内声明的变量通常是一组大括号{…},在该范围外是不可访问的。您已经在循环中声明了响应。您需要在循环之外声明响应

在比较字符串之前,还需要使用。否则,结尾将有一个换行符\n,导致比较失败

string response;

do {
    //...

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

您的响应变量不在循环的上下文中。只需将变量声明移到循环外部,如下所示:

        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");

您的响应变量不在循环的上下文中。只需将变量声明移到循环外部,如下所示:

        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");

可能有助于将其封装一点。那么:

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; 

可能有助于将其封装一点。那么:

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; 

您在循环中声明了响应,因此它通常存在于循环中。一个新的缩进级别将创建一个新的块范围。。您可能还希望为整个循环创建一个随机实例,而不是为每个迭代创建一个随机实例如果您在循环内部定义响应,那么它应该如何在循环外部检查它?您必须在loopResponse在{}范围之外确实不可见之前定义字符串响应,在Do之前声明它您还应该读取并获取…仅仅因为您还没有yetNitpick:Console.ReadLine已经给出了字符串结果。无需转换为字符串。您在循环中声明了响应,因此它通常存在于循环中。新的缩进级别将创建新的块范围。。您可能还希望为整个循环创建一个随机实例,而不是为每个迭代创建一个随机实例如果您在循环内部定义响应,那么它应该如何在循环外部检查它?您必须在loopResponse在{}范围之外确实不可见之前定义字符串响应,在Do之前声明它您还应该读取并获取…仅仅因为您还没有yetNitpick:Console.ReadLine已经给出了字符串结果。无需转换为字符串,无需为每次迭代创建一个新的随机变量;这是个坏习惯。不需要转换.ToStringeither@Plutonix-您是正确的,但仅在大括号内使用的局部变量应在大括号内声明,以限制范围。编译器足够聪明,可以尽可能提高效率。编译器不会将随机创建移动到循环外部。这里有数百个问题,OP一次又一次地得到相同的数字,因为他们在循环中创建了一个新的数字。另外,r.Next1,5也不会从1-5和另一个生成一个数字:而且@Joe编译器会检测到试图使用未初始化的局部变量。在这里初始化变量是不正确的,因为它的初始值永远不会被使用。某些工具(如ReSharper)甚至可能会自动建议您删除初始化。有人曾经说,嘿,你应该初始化局部变量,人们把它变成了一个硬规则,而不是一般的建议。。。就像omg从不使用goto狂热者一样,不需要为每次迭代创建一个新的随机变量;这是个坏习惯。不需要转换.ToStringeither@Plutonix-您是正确的,但仅在大括号内使用的局部变量应在大括号内声明,以限制范围。编译器足够聪明,可以尽可能提高效率。编译器不会将随机创建移动到循环外部。这里有数百个问题,OP一次又一次地得到相同的数字,因为他们在循环中创建了一个新的数字。另外,r.Next1,5也不会从1-5和另一个生成一个数字:而且@Joe编译器会检测到试图使用未初始化的局部变量。在这里初始化变量是不正确的,因为它的初始值永远不会被使用。某些工具(如ReSharper)甚至可能会自动建议您删除初始化。有人曾经说,嘿,你应该初始化局部变量,人们把它变成了一个硬规则,而不是一般的建议。。。就像omg从不使用goto狂热者一样。每次你想要一个随机数时创建一个新的随机对象是不正确的。我希望你否决了所有其他人,因为我只使用他们提供的代码。无论如何,我都会纠正它,即使这对处理时间或内存没有影响
GC应该收集这些信息,因为它超出了每次调用的范围,并且系统在等待用户响应时处于空闲状态,并且根据需要……我实际上认为您是错误的,尽管我相信我满足了您的建议。遵循适当的OOP,最好像我那样将随机化封装到一个方法中。循环应尽可能保持干净,因为其目的是收集用户输入,输入的处理应在其他地方进行。为每个方法调用创建一个新的随机变量是完全可以的,但不能在循环本身中创建,因为这会阻止GC收集引用,因为引用永远不会被释放。但是,在它自己的方法中,它们将随每个调用和返回值一起发布。我希望您打算响应或删除您的否决票,因为这段代码工作得很好,我相信它之前的形式比你推荐的更正确。请看上面的评论:每次你想要一个随机数时创建一个新的随机对象是不正确的。我希望你否决了所有其他人,因为我只使用他们提供的代码。无论如何,我都会纠正它,即使这对处理时间或内存没有影响,因为GC应该收集它,因为它不在范围内,每次调用和系统在等待用户响应时都会空闲,并且根据需要…我实际上相信你是错的,尽管我相信我满足了你的建议。遵循适当的OOP,最好像我那样将随机化封装到一个方法中。循环应尽可能保持干净,因为其目的是收集用户输入,输入的处理应在其他地方进行。为每个方法调用创建一个新的随机变量是完全可以的,但不能在循环本身中创建,因为这会阻止GC收集引用,因为引用永远不会被释放。但是,在其自己的方法中,它们将随每个调用和返回值一起发布。我希望您打算响应或删除您的否决票,因为此代码工作正常,并且我相信其先前的形式比您建议的更正确。请参阅上面的评论: