我们发现我们的一个自动生成的程序集在 new() 上抛出了 StackOverflowException。此类具有(请耐心等待)400 多个在构造函数中初始化的简单属性(大多数默认情况下(字符串)等)。
我们注意到它在 64 位上很好,但在 32 位上它会爆炸!
我们需要测试我们的用例是否可以合理地创建一个更大的默认堆栈,以便在我们重新设计代码生成器时给我们喘息的空间。
我们会特别是。如果可能的话,对涉及 app.config 的解决方案感兴趣。但我是一个现实主义者,所以一切都会好的。
重新堆栈溢出的原因。我们已将错误范围缩小到有问题的构造函数中。我的第一印象也是无限递归的类型。但是,我们使用 3 行控制台应用程序重现了该错误:
- 创建一个空的类实例。
- 调用类的非静态方法(克隆),第一个工作是创建和空实例准备将属性传递到。
当它碰到第二个构造函数时它会爆炸。
现在使用 .net 源代码进行调试,我们看到堆栈溢出在 Guid.NewGuid() 中,它作为第二个参数传递给构造函数。实际的代码行是对本机 CoCreateGuid() 调用的调用。
因此,虽然它可能是 CoCreateGuid() 中的错误,但我们希望从问题中消除我们的代码。我的第一个想法是大量增加堆栈的大小,看看这个错误是否再次发生。然后,因为我认为我们可以控制所有用例,所以将构造函数替换为对象初始化 - 认为这可以减轻堆栈的压力。
NB。我们可以通过从类中删除 int 属性来阻止错误的发生。