2012-11-28 19 views
-1

我正在編寫一個類,它遞歸地實例化自身,以便將XSD解析爲另一種類型的XSD。它從互聯網下載並遍歷每個元素,如果其中一個元素具有位於另一個URI中的complexType,則它通過創建其自身的一個實例來執行相同的操作。使用靜態方法防止Stackoverflow異常

但是,當XSD太大並且有很多外部鏈接時,由於Stackoverflow例外,今天我的班級崩潰了。

我決定把一些實例方法作爲靜態成員放到另一個類(Helper.cs)中,現在在解析器類中調用它們。

但我不知道這是一個很好的解決方案,可以解決Stackoverflow異常嗎?我知道如何將實例方法放入堆棧框架,但是會以相同的方式處理靜態方法嗎?它會導致任何Stackoverflow異常?

回答

8

實例方法和靜態方法的唯一區別是實例方法需要額外隱藏this參數。 (實際上,實例方法也可以是virtual,但在這裏沒有任何區別)

它們同樣容易受到堆棧溢出的影響。

如果您希望避免大輸入的堆棧溢出,請不要使用遞歸。

+0

那麼他應該怎麼做才能解決問題? –

+0

現在聽起來很糟糕! – Tarik

+1

+1。用於解析不可信輸入的遞歸代碼是安全問題。沒有太多的事情要做,但重構,以避免遞歸或有某種「深度遞歸預防」計數器失敗的過度嵌套結構。 –

1

靜態與實例對問題沒有影響。堆棧深度根據調用而升降,而不是在包含堆棧或堆的函數的實際內存上。

查找沒有固定退出條件的任何遞歸,計數到無窮大的循環或數據源太簡單了。您的項目是在網絡服務器上運行嗎? IIS對堆棧大小(編譯爲w3wp.exe)具有內置限制,比桌面應用程序更具限制性。