继续检查没有堆栈溢出的值

时间:2013-08-31 03:21:35

标签: c# stack-overflow

对于我正在研究的小型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 个答案:

答案 0 :(得分:3)

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

private void button_Click(object sender, EventArgs e)
{
     if(input=="YES" || input=="Y")
        //do stuff
     else
        //reshow question
}

答案 1 :(得分:1)

在第一个中,你调用的是一种无休止的递归方法(一种调用自身的方法),它会导致堆栈溢出。

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

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

哦,顺便说一下,你在循环中缺少break个关键字。

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分: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
        }
    }
}

另外,无论你是否得到正确的值,它都将继续执行代码。