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

最初のものでは、スタックをオーバーフローさせる一種の無限再帰メソッド (それ自体を呼び出すメソッド) を呼び出しています。

ただし、2 番目のメソッドには、1 回呼び出される単一のメソッドがあり、そのメソッドでループが呼び出されます。

ループが次の反復に進むと、前の反復は閉じられ、スタックがオーバーフローすることはありません。

ところで、breakループにキーワークがありません。

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

最初の例では、input != Y のためスタック オーバーフローが発生したため、else ブランチにジャンプし、intro が再度呼び出され、intro が再度呼び出され、intro が再度呼び出され、というように続きます。- これはオーバーフローするスタックです。

フォームがインスタンス化されるときに 2 番目のループがアクティブ化されている場合、ループから抜け出して実際にフォームを表示することはありません。

このような単純なフォームであっても、イベントに依存してロジックを駆動する必要があります。入力がテキストボックスを参照している場合は、TextChangedイベントに接続します。フォームは、別のスレッドで実行されない限り UI をロックするため、無限ループを実行することを意図していません。これにより、UI を操作する必要がある場合に複雑さが増します。

于 2013-08-31T03:33:42.503 に答える