考虑以下代码:
private static int i = 0;
static void Main(string[] args)
{
DoSomething();
Console.ReadLine();
}
public static void DoSomething()
{
Console.WriteLine(i);
++i;
DoSomething();
}
每次运行时,我都会StackOverflowException
获得i
变量的不同值。例如 16023 , 16200 , 16071 。
这背后的原因是什么?这是C#编译器中的错误吗?
答案 0 :(得分:4)
无界递归的行为是实现定义的。实现定义意味着它可以执行任何。程序可以随时终止(或永不终止),抛出未处理的异常,或其他任何东西。例如,编译为MSIL并在64位操作系统上运行,程序永远不会终止。这是因为允许抖动将递归转换为64位抖动所做的循环。询问为什么它终止于特定值没有实际意义,因为允许运行时任何。
答案 1 :(得分:1)
你的stacksize还不够大。
您可以通过启动新线程并在构造函数中定义新的stacksize来增加默认堆栈大小:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApplication3
{
class Program
{
private static int i = 0;
static void Main(string[] args)
{
Thread T = new Thread(DoSomething, 100000000);
T.Start();
Console.ReadLine();
}
public static void DoSomething()
{
Console.WriteLine(i);
++i;
DoSomething();
}
}
}
Stackoverflow现在发生了150万次递归调用。