在循环C#中访问和更改局部变量

时间:2017-01-01 16:08:31

标签: c# while-loop

我目前正在尝试通过用户输入定义两个整数变量。如果用户输入未包含在定义范围内的整数,则会要求用户再次输入,直到用户输入接受的值。

static void Main(string[] args)
{
    int a;
    int b;

    bool isAValid = false;
    bool isBValid = false;

    while (isAValid == false)
    {
        Console.Write("Input number from 2 to 20: ");
        isAValid = true;

        a = Convert.ToInt16(Console.ReadLine());

        if (a < 2 || a > 20)
        {
            isAValid = false;
        }
    }

    while (isBValid == false)
    {
        Console.Write("Input number from 2 to 20: ");
        isBValid = true;

        b = Convert.ToInt16(Console.ReadLine());

        if (b < 2 || b > 20)
        {
            isBValid = false;
        }
    }
}

我要完成的是将用户输入分别保存为 a b ,因此将局部变量值定义为用户输入值。但是,当我在最后一个while循环被破坏后尝试访问局部变量时,我得到&#34; 使用未分配的局部变量 a (或 b &#34 ;.

任何想法如何定义变量,同时仍然有输入提示循环?

2 个答案:

答案 0 :(得分:1)

有趣的是,编译器无法看到始终输入while循环,并始终初始化ab

更新:Eric Lippert评论说,为了流量控制分析,所有涉及变量的表达式都被认为是真或假; 甚至是像x*0 == 0这样的表达式。

我们看到while条件始终为真,部分原因是我们知道输入的这个小逻辑模式。我们知道循环是什么。 编译器没有。 它看到一个任意条件,并且不能被证明它总是正确的。它只是考虑所有带有变量的表达式是非常数的。

解决这个问题的一种方法是在语言中更好地表达程序的逻辑。这种模式并不罕见:“重复一些事情直到满足条件”。特别是,在任何情况下都至少执行一次。在所有C系列语言中都有一种语言结构:do / while循环。重写a的循环给出了

do
{
    Console.Write("Input number from 2 to 20: ");
    isAValid = true;

    a = Convert.ToInt16(Console.ReadLine());

    if (a < 2 || a > 20)
    {
        isAValid = false;
    }
} while (isAValid == false);

现在我可以在循环后访问a;编译器认识到分配将得到保证。这同样适用于b

这也使我们能够编写更少杂乱的代码。只需要在首次输入while循环时进行“人工”测试,才需要辅助变量isAValid。测试是人为的,因为我们还没有任何输入,因此无法真正测试任何东西。如果我们确实只在输入之后测试,那么测试数据可用,我们可以将测试正确地置于条件中。归结为

do
{
    Console.Write("Input number from 2 to 20: ");
    a = Convert.ToInt16(Console.ReadLine());

} while (a < 2 || a > 20);

答案 1 :(得分:0)

要解决您的错误,请声明:

order

而不是:

level

这将初始化您的本地变量并修复您的错误消息。