我正在编写一个类,它递归地实例化自己,以便将XSD解析为另一种类型的XSD。它从互联网上下载并浏览每个元素,如果其中一个元素的complexType
位于另一个URI
,那么它只是通过创建自身的一个实例来做同样的事情。 / p>
但是当XSD如此庞大且有许多外部链接时,今天我的课程由于Stackoverflow
异常而崩溃。
我决定将一些实例方法作为静态成员放到另一个类(Helper.cs
)中,现在从解析器类中调用它们。
但是我想知道这是否是一个很好的解决方案,可以解决Stackoverflow
异常?我知道如何将实例方法放入堆栈框架中,但静态方法是否会以相同的方式处理?它会导致任何Stackoverflow
例外吗?
答案 0 :(得分:8)
实例方法和静态方法之间的唯一区别是实例方法需要一个额外的隐藏this
参数。 (实际上,实例方法也可以是virtual
,但这在这里没有任何区别)
它们同样容易受到堆栈溢出的影响。
如果要避免大输入的堆栈溢出,请不要使用递归。
答案 1 :(得分:1)
静态vs实例与此问题无关。堆栈深度根据调用而上升和下降,而不是包含函数的实际内存,无论是堆栈还是堆栈。
查找没有可靠退出条件的任何递归,计数到无穷大的循环,或者只是太大的数据源。你的项目是在网络服务器上运行的? IIS对堆栈大小有内置限制(编译为w3wp.exe),这比桌面应用程序更具限制性。