簡體   English   中英

C# Stackoverflow“Exception_WasThrown”

[英]C# Stackoverflow "Exception_WasThrown"

我對以下代碼有一個“問題”(更多的是一個理論,然后是一個我需要批准的問題)。

當我啟動程序時,它將導致異常:System.StackOverflowException:“Exception_WasThrown”。

我的理論現在是這個異常是剛剛引起的,因為我在主方法內部創建了一個“LOG”的 object,在 FileSize 內部創建了一個 ZA8CFDE6331BD59B626696 LOG 它還嘗試創建 object FileSize 以及此過程及其循環。

這是對的還是我誤解了,如果是,請向我解釋。

    static void Main(string[] args)
    {
        LOG log = new LOG();
        log.getFileSize(); 

    }
}

public class LOG
{
    FileSize fileSize = new FileSize();
    
    public void getFileSize()
    {

    }
}

public class FileSize
{
    LOG Log = new LOG(); 
}

你是對的。 Inside the main method you create an instance of the LOG class.The LOG class creates a new instance of the FileSize class,and the FileSize class creates a new instance of the LOG class.So it's an infinite loop.

你的預感是正確的。 你在那里編程的是無限遞歸。

當然實際上,這個無限遞歸並不是真的無限,因為調用棧 編譯器優化無法承受,當一個方法被調用一定數量的 memory 時,這個調用堆棧上的一個堆棧幀被分配,並且當該方法返回/退出時,這個堆棧幀再次從調用堆棧中彈出。 (堆棧幀包含與特定方法調用有關的各種信息,與傳遞給方法和從方法返回的值有關,方法返回時返回到哪個代碼地址等)

在代碼中再次出現“無限”遞歸的情況下,被調用的方法(如getFileSize()LOG構造函數)永遠不會返回,只是一次又一次地調用自己。 因此,越來越多的堆棧幀堆積在調用堆棧上,而不會再次彈出(因為遞歸調用的方法永遠不會返回),直到調用堆棧中的空間耗盡並且 StackOverflowException 被拋出作為響應,然后轉理論上的無限遞歸到具有災難性結論的實際有限遞歸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM