发生了'System.StackOverflowException'类型的未处理异常

时间:2013-07-29 21:41:54

标签: c#

我收到错误我的代码中出现了Forte Sender.exe 中出现'System.StackOverflowException'类型的未处理异常。我理解这意味着我的代码中存在无限循环,但我似乎无法找到这个循环。这是我的代码:

Form1中:

public partial class MainBox : Form
{
    //Making a name for the ApplicationProperties form. It can be opened when called.
    ApplicationProperties ApplicationPropertiesWindow = new ApplicationProperties();
    //All of the functions for form1 below.

窗体2:

public partial class ApplicationProperties : Form
{
    MainBox MainBoxWindow = new MainBox();
    //All of the funcitons for form2 below.

所以我注意到如果我拿出MainBox MainBoxWindow = new MainBox();程序将正确运行。但我需要那个实例来调用Form1中的函数。我怎样才能解决这个问题?无论是调用函数还是解决无限循环的不同方式。

4 个答案:

答案 0 :(得分:6)

好吧,您的MainBox会创建一个ApplicationProperties,而MainBox会创建一个ApplicationProperties,从而无限制地创建一个new MainBox()。显然你需要打破这个循环。

正如您的代码现在所示,您可能希望删除属性表单的ApplicationProperties ApplicationPropertiesWindow = new ApplicationProperties(); ApplicationPropertiesWindow.MainBoxWindow = this; 并在之后注入它,例如:

public partial class ApplicationProperties : Form
{
    public MainBox MainBoxWindow { get; set; }
}

{{1}}

答案 1 :(得分:2)

你只需打开一个表单,然后从它的构造函数中打开另一个表单,它会在t的构造函数中再次打开第一个表单,等等......

在创建实例时,在构造函数之前执行字段初始值设定项。

答案 2 :(得分:2)

您的ApplicationProperties类会创建一个MainBox对象,而您的MainBox对象会创建一个ApplicationProperties对象。这是循环。每次调用new都是该循环中的另一个构造函数调用。构造函数在称为相互递归的东西中相互调用,这会导致堆栈溢出。

答案 3 :(得分:2)

您正在MainBox内部ApplicationPropertiesApplicationProperties内创建MainBox,这将继续创建由StackOverFlowException生成的实例

为了避免这种情况,您可以在OnLoad重写方法中创建实例,但创建相互关联的实例没有意义,您是否意味着使用相同的引用?