C# 重试,直到用户输入正确

C# 重试,直到用户输入正确,c#,C#,我正在学习C#via,在理解变量范围方面遇到了一个问题 我开发的类(在底部)要求输入一个数字,然后将其显示给用户。我想对它进行增强,这样如果用户输入10而不是10,它将输出一条消息,用户将再次尝试 以下是迄今为止在改变方面的几次尝试之一 ... static int readInt(string prompt, int low, int high) { int result; do { try

我正在学习C#via,在理解变量范围方面遇到了一个问题

我开发的类(在底部)要求输入一个数字,然后将其显示给用户。我想对它进行增强,这样如果用户输入10而不是10,它将输出一条消息,用户将再次尝试

以下是迄今为止在改变方面的几次尝试之一

...

    static int readInt(string prompt, int low, int high)
    {
        int result;

        do
        {
            try
            {
                string intString = readString(prompt);
                result = int.Parse(intString);
                Console.WriteLine("Thank you");
            }
            catch
            {
                Console.WriteLine("Invalid age value");
            }

        } while ((result < low) || (result > high));

        return result;
    }
...

编译器不知道
while
循环实际运行(它可以在分配
结果
之前抛出异常)并在
结果
上设置一个值。因此,它对此表示不满

您可以通过为
结果
指定默认值来规避此问题:

int result = -1;
或者通过在
catch
块中设置值:

catch
{
    result = -1;
    Console.WriteLine("Invalid age value");
}

在这些情况下,我总是使用
-1
作为“此值有问题”的指示器。

除了Patrick Hoffman的答案(这是正确的)之外,您还应该考虑使用
int.TryParse
而不是
int.Parse

将异常处理用于流控制通常是个坏主意,这说明了其中一个原因。编译器意识到在实际分配
结果之前可能会发生异常(如果用户从未输入数值,事实上就是这种情况)。它将无法正确计算未赋值变量。如果使用
TryParse
,则不会出现此特定问题


只有当您意识到存在超出常规代码和检查控制或处理能力的因素时,才应使用异常处理(
if(bTryParseReturn==false)…
)-例如,当用户输入可能存在问题,无法直接测试时。即使这样,异常也会产生一个错误,而不仅仅是“重试”情况——完全可能永远无法从异常中恢复或避免异常,特别是因为您正在捕获所有异常(而不仅仅是
InvalidCastException
或类似的情况)。例如,假设异常是一个
System.OutOfMemoryException
(用户试图在您的提示下输入一个terrabyte的数据)。从用户的角度来看,您的程序将尝试愉快地运行,但会可怕地崩溃。

编译器无法保证属性结果已设置,但仍希望在方法结束时输出结果

可能会引发异常或各种其他问题,阻止在到达方法的最后一行之前设置结果

因此,编译器正在抢占NullReferenceException场景,并将其视为编译错误

这是在帮你一个忙:)

如前所述,为属性结果提供一个默认值以解决此问题


如果属性处于类级别,则会隐式设置它的属性类型默认值-但这是另一个问题。

如果您最初确实不想将结果设置为任何值,则只想添加可能的解决方案:

static int readInt(string prompt, int low, int high)
{            
    bool validInput;
    int result;

    do
    {
        if ((validInput = int.TryParse(readString(prompt), out result)))
            Console.WriteLine("Thank you");
        else
            Console.WriteLine("Invalid age value");

    } while (!validInput || (result < low) || (result > high));
}
static int readInt(字符串提示,int低,int高)
{            
布尔有效输入;
int结果;
做
{
if((validInput=int.TryParse(读取字符串(提示),输出结果)))
Console.WriteLine(“谢谢”);
其他的
Console.WriteLine(“无效年龄值”);
}而(!validInput | | |(结果<低)| |(结果>高));
}

如果
TryParse
失败,结果将被设置为整数默认值(0),并且
validInput
变量将被设置为false,以便再次执行循环。

谢谢,我非常感谢您提供的异常处理指南和int.TryParse,这两种方法都非常受欢迎。
static int readInt(string prompt, int low, int high)
{            
    bool validInput;
    int result;

    do
    {
        if ((validInput = int.TryParse(readString(prompt), out result)))
            Console.WriteLine("Thank you");
        else
            Console.WriteLine("Invalid age value");

    } while (!validInput || (result < low) || (result > high));
}