-1

我正在编写一个递归实例化自身的类,以便将 XSD 解析为另一种类型的 XSD。它从 Internet 下载它并遍历每个元素,如果其中一个元素具有complexType位于另一个元素中的 a,URI那么它只需通过创建一个自身的实例来做同样的事情。

但是当XSD这么大而且有很多外部链接时,今天我的班级因为Stackoverflow异常而崩溃了。

我决定将一些实例方法Helper.cs作为静态成员放到另一个类 ( ) 中,现在从解析器类中调用它们。

但是我想知道这是否是一个很好的解决方案并且可以解决Stackoverflow异常?我知道实例方法是如何放入堆栈帧的,但是静态方法会以同样的方式处理吗?它会导致任何Stackoverflow异常吗?

4

2 回答 2

8

实例方法和静态方法的唯一区别是实例方法带有一个额外的隐藏this参数。(实际上,实例方法也可以是virtual,但这在这里没有任何区别)

它们都同样容易受到堆栈溢出的影响。

如果要避免大型输入的堆栈溢出,请不要使用递归。

于 2012-11-28T17:54:57.367 回答
1

静态与实例与这个问题无关。堆栈深度根据调用上升和下降,而不是在包含函数的实际内存上,无论是在堆栈上还是在堆上。

寻找任何没有可靠退出条件的递归、计数到无穷大的循环或太大的数据源。您的项目是否在网络服务器上运行?IIS 对堆栈大小(编译成 w3wp.exe)有一个内置限制,比桌面应用程序更严格。

于 2012-11-28T18:00:02.007 回答