![](/img/trans.png)
[英]"Process is terminating due to StackOverflowException", reason for it in the following code
[英]Process is terminating due to StackOverflowException on calling GetType()
當我忘記使用靜態修飾符並將其簡化為可復制的代碼段時,我無意間遇到了這個問題。 運行時,以下將失敗並顯示StackOverflowException:
namespace test
{
class Program
{
Program program = new Program();
public static void Main(string[] args)
{
var p = new Program();
System.Console.WriteLine(p.GetType());
}
}
}
為什么會失敗? 是錯誤還是我對CLR的誤解?
令人討厭的行不是p.GetType()
,而是Program
的類型初始值設定項。
創建程序實例時, var p = new Program();
它運行Program
的初始化Program
來設置新實例。 這包括運行對Program
字段的所有分配。
此初始化字段是罪魁禍首:
Program program = new Program();
要創建Program
的實例,必須通過創建Program
的新實例來初始化現場program
。 這將導致無限的初始化程序堆棧,並生成您的StackOverflowException
。
我認為它將遞歸地嘗試創建新的Program()對象,直到由於行而導致堆棧溢出:
class Program
{
Program program = new Program();
您創建一個程序,然后創建一個程序,然后創建一個程序...等到無窮大。
我不確定您需要在這里完成什么,但是如果您需要在同一類中創建一個類的實例,那么我會假設您最終需要打一個基本案例才能停止遞歸。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.