我正在制作一个控制台应用程序游戏 (C#),并且 运行 陷入 Stack Overflow 错误。如何避免?

I'm making a Console Application Game (C#), and I'm running into Stack Overflow Error. How to avoid?

我的游戏针对游戏的每个状态都有多个方法,这些方法在适用的情况下相互调用。这会在一段时间后导致堆栈溢出错误。有什么办法可以避免这种情况,也许是解决方法?

编辑:正如下面的用户所建议的,我的代码基本上是:

void a()
{
    b();
}

void b()
{
    a();
}

在这段代码中,我打算使用递归来改变游戏状态。 有什么方法可以重置堆栈,这样它就不会导致溢出错误,然后 return 方法。

可能的修复:(这只是延迟了 Stack Overflow 还是已经消除了它?)

int tracker;
void start()
{
    a();
    resetter();
}

void a()
{
    b();
}

void b()
{
    if (tracker > 10)
    {
        tracker = 0;
        return;
    }
    else
        tracker++;
    a();
}

void resetter()
{
    start();
}

我假设你正在做类似的事情:

void A()
{
  B();
}
void B()
{
  A();
}

根据定义,这将始终导致堆栈溢出。这主要是因为堆栈的工作方式。假设您首先调用 A,当此方法调用 B 时,此方法的 parameters/variables/... 将被放入堆栈。 然后,这个方法(B),调用'A';发生的那一刻,它将把它的参数放在堆栈上。

方法return秒后,栈上的数据被清除。但是这两种方法永远不会 return...他们一直在互相调用,比如:

A()
  --> B()
    --> A()
      --> B()
        --> A()
          --> B()
            --> A()
              --> B()
               --> A()

如您所见,越来越多的东西被放入堆栈,导致溢出。

你会希望你的递归停止来解决这个问题。您可以通过在任一方法中引入停止条件来做到这一点,这将 return.

如果您希望更具体地回答您的问题,请添加一些代码。但是既然你说的是A调用B,B调用A,那么上面的伪代码应该就足够了。