1

对于我正在处理的一个小型 C# Windows 窗体项目,我需要问一个简单的 Y/N 问题。我需要它重复,直到它被赋予正确的值。如果我使用此代码,它会创建堆栈溢出:

    void Intro()
    {

        if (input == "YES" || input == "Y")
        {
          //Do Stuff
        }
        else
        { 
            Intro();
        }
    }

我环顾四周,显然处理此问题的最佳方法是使用 while 循环。所以我尝试使用这段代码,这导致我在编译和运行时无法加载表单:

    void Intro()
    {
        while (true)
        {
            if (input == "YES" || input == "Y")
            {
              //Do Stuff
            }
        }
    }

它不会给出任何错误,并且会一直运行直到我停止它。该方法在 InitializeComponent 之后立即运行。这可能是一个非常愚蠢的问题,如果能在几秒钟内回答,那就抱歉了。

4

4 回答 4

3

你应该把检查放在一个事件中;它不一定是按钮单击事件。

private void button_Click(object sender, EventArgs e)
{
     if(input=="YES" || input=="Y")
        //do stuff
     else
        //reshow question
}
于 2013-08-31T03:31:51.520 回答
1

第一个示例创建了堆栈溢出,因为 input != Y,所以它跳转到 else 分支,该分支再次调用 intro,再次调用 intro,再次调用 intro,以此类推。- 这是溢出的堆栈。

如果在实例化表单时激活了第二个循环,它将永远不会退出循环以实际显示表单。

即使是这样一个简单的表单,您也需要依靠事件来驱动您的逻辑。如果输入是指文本框,则连接到TextChanged事件。表单不打算运行无限循环,因为它们会锁定 UI,除非它们在单独的线程中运行,如果您需要与 UI 交互,这会导致额外的复杂性。

于 2013-08-31T03:33:42.503 回答
1

第一个代码创建了递归,太多的递归调用填满了堆栈,你得到了StackOverFlowException.

第二个代码包含一个无限循环,它会毫无延迟地继续执行代码,因此您的应用程序会挂起。

执行此任务的正确方法:

void Intro()
{
    while (true)
    {
        if (input == "YES" || input == "Y")
        {
          //Do Stuff
          break; //it will break the loop when you will get the correct value
        }
    }
}

否则,无论您是否获得正确的值,它都会继续执行代码。

于 2013-08-31T03:38:27.420 回答
1

在第一个中,您正在调用一种无限递归方法(一种调用自身的方法),这会导致堆栈溢出。

然而,在第二种方法中,有一个方法被调用一次,并且在该方法中调用了一个循环。

当循环进行下一次迭代时,前一次迭代关闭,不会导致堆栈溢出。

break哦,顺便说一句,您在循环中缺少关键工作。

void Intro()
{
    while (true)
    {
        if (input == "YES" || input == "Y")
        {
          //Do Stuff
          break;
        }
    }
}
于 2013-08-31T03:24:01.937 回答